2014-11-03 3 views
2

Вот воспроизводимые данные, которые я использую в качестве примера.Аналогичные факторы группы - заполняет ggplot2

Name <- c("Blueberry", "Raspberry", "Celery", "Apples", "Peppers") 
Class <- c("Berries", "Berries", "Vegetable", "Fruit", "Vegetable") 
Yield <- c(30, 20, 15, 25, 40) 
example <- data.frame(Class = Class, Name = Name, Yield = Yield) 

Когда заговор с ggplot2 мы получаем ...

ggplot(example, aes(x = Name, y = Yield, fill = Name))+ 
    geom_bar(stat = "identity") 

Graph

Было бы полезно, если бы мы могли дать заливку аналогичного цвета на те, которые имеют один и тот же класс. Например, если Овощи были синими оттенками, ягоды были оттенками розового, а Фрукты были зеленого цвета, вы могли видеть урожай по классам растений, но все же визуально видеть название (что для нас более важно)

I чувствую, что я мог бы сделать это с scale_fill_hue(), но я не могу заставить его работать

ggplot(example, aes(x = Name, y = Yield))+ 
    geom_bar(aes(fill = Class),stat = "identity")+ 
    scale_fill_hue("Name") 

Class

ответ

2

Основная конструкция в ggplot является одной шкалой на aes тети (см. Мнение @ hadley, например. here). Таким образом, в случае, подобном вашему, необходимы обходы. Здесь есть одна возможность, где fill цвета генерируются за пределами ggplot. Я использую цветовые палитры, предоставляемые пакетом RColorBrewer. Вы можете легко проверить разные палитры here. Для фактического массажа данных используются функции dplyr. Сформированные цвета затем используются в scale_fill_manual:

library(dplyr) 
library(RColorBrewer) 

# create look-up table with a palette name for each Class 
pal_df <- data.frame(Class = c("Berries", "Fruit", "Vegetable"), 
        pal = c("RdPu", "Greens", "Blues")) 

# generate one colour palette for each Class 
df <- example %>% 
    group_by(Class) %>% 
    summarise(n = n_distinct(Name)) %>% 
    left_join(y = pal_df, by = "Class") %>% 
    rowwise() %>% 
    do(data.frame(., cols = colorRampPalette(brewer.pal(n = 3, name = .$pal))(.$n))) 

# add colours to original data 
df2 <- example %>% 
    arrange(as.integer(as.factor(Class))) %>% 
    cbind(select(df, cols)) %>% 
    mutate(Name = factor(Name, levels = Name)) 

# use colours in scale_fill_manual 
ggplot(data = df2, aes(x = Name, y = Yield, fill = Name))+ 
    geom_bar(stat = "identity") + 
    scale_fill_manual(values = df2$cols) 

enter image description here

Возможное расширение будет создавать отдельные легенды для каждого класса «шкалы». См. мои предыдущие попытки here (second example) и here.

0

Вы можете использовать альфа-шкалу, как быстро (хотя и не идеально) способ изменения интенсивности цвет в пределах одного класса:

library("ggplot2"); theme_set(theme_bw()) 
library("plyr") 
## reorder 
example <- mutate(example, 
       Name=factor(Name,levels=Name)) 
example <- ddply(example,"Class",transform,n=seq_along(Name)) 
g0 <- ggplot(example, aes(x = Name, y = Yield)) 
g0 + geom_bar(aes(fill = Class,alpha=factor(n)),stat = "identity")+ 
    scale_alpha_discrete(guide=FALSE,range=c(0.5,1)) 
Смежные вопросы