2016-05-21 2 views
0

Я пытаюсь добавить пользовательскую легенду моей ggplot, аналогично примеры в: http://docs.ggplot2.org/0.9.2.1/scale_gradientn.htmlДобавить пользовательские ggplot легенды

Я хочу бруски в сюжете должны быть окрашены в соответствии с df$col колонки и по этой причине Я использую scale_fill_manual с values = coloursv.

set.seed(1) 
df <- data.frame(log10.p.value = -10*log10(runif(10,0,1)), y = letters[1:10], col = rep("#E0E0FF",10), stringsAsFactors = F) 
#specify color by log10.p.value 
df$col[which(df$log10.p.value > 2)] <- "#EBCCD6" 
df$col[which(df$log10.p.value > 4)] <- "#E09898" 
df$col[which(df$log10.p.value > 6)] <- "#C74747" 
df$col[which(df$log10.p.value > 8)] <- "#B20000" 
#truncate bars 
df$log10.p.value[which(df$log10.p.value > 10)] <- 10 
coloursv <- df$col 
names(coloursv) <- df$col 
p <- ggplot(df, aes(y=log10.p.value,x=y,fill=as.factor(col)))+ 
    geom_bar(stat="identity",width=0.2) + 
    scale_y_continuous(limits=c(0,10)) + 
    theme(axis.text=element_text(size=10)) + 
    scale_fill_manual(values = coloursv)+coord_flip()+ 
    scale_fill_gradientn(colours=c("#EBCCD6","#E09898","#C74747","#B20000","#E0E0FF"), 
         breaks=c(-4,-3,-2,-1,0),guide="colorbar",labels=c(2,4,6,8,10)) 

И получать ничего:

enter image description here

ответ

2

Вы не получаете легенду, потому что у вас есть scale_fill_manual(values = coloursv,guide=F) и guide=F предотвращает заполняющий легенду к показу.

С другой стороны, scale_color_gradientn устанавливает эстетику цвета, но у вас нет цветовой эстетики на вашем участке. Вероятно, вы имели в виду scale_fill_gradient (в этом случае вы также не хотели бы иметь scale_fill_manual). Однако, даже если вы переключите этот оператор на scale_fill_manual, вы установите разрывы на значения, находящиеся вне диапазона значений в ваших данных (диапазон разрывов от -4 до 0, но диапазон данных составляет от 0,4 до 10).

Добавление df$col не устанавливает цвета, которые могут быть нанесены на график. Он просто создает категориальную переменную с разными значениями категорий в разных диапазонах log10.p.value. Вы могли бы назвать значения категорий что угодно, а ggplot2 имеет цветовую палитру по умолчанию, которая одинакова независимо от имен категорий и зависит только от количества категорий. Если вы хотите категориальные значения, вместо этого вы можете использовать функцию вырезания, как показано ниже.

Вот несколько примеров, иллюстрирующих различные варианты заполнения и легенды:

# Create log10.p.value categories 
df$log10.p.value.cat = cut(df$log10.p.value, seq(0,10,2)) 

# Fill bars based on log10.p.value.cat 
p1=ggplot(df, aes(y=log10.p.value, x=y, fill=log10.p.value.cat)) + 
    geom_bar(stat="identity", width=0.2) + 
    scale_y_continuous(limits=c(0,10)) + 
    theme(axis.text=element_text(size=10)) + 
    coord_flip() 

Участок под это один ваш вопрос с легендой включен. Обратите внимание, что порядок цветов в scale_fill_manual должен соответствовать порядку соответствующих значений в log10.p.value.cat, чтобы получить желаемый цвет для каждой категории.

# Fill bars based on log10.p.value.cat with custom colors 
p1a=ggplot(df, aes(y=log10.p.value, x=y, fill=log10.p.value.cat)) + 
    geom_bar(stat="identity", width=0.2) + 
    scale_y_continuous(limits=c(0,10)) + 
    theme(axis.text=element_text(size=10)) + 
    coord_flip() + 
    scale_fill_manual(values=c("#E0E0FF","#EBCCD6","#E09898","#C74747","#B20000")) 

# Continuous fill gradient based on log10.p.value 
p2=ggplot(df, aes(y=log10.p.value, x=y, fill=log10.p.value)) + 
    geom_bar(stat="identity", width=0.2) + 
    scale_y_continuous(limits=c(0,10)) + 
    theme(axis.text=element_text(size=10)) + 
    coord_flip() 

# Continuous fill gradient based on log10.p.value with custom colors 
p2a=ggplot(df, aes(y=log10.p.value, x=y, fill=log10.p.value)) + 
    geom_bar(stat="identity", width=0.2) + 
    scale_y_continuous(limits=c(0,10)) + 
    theme(axis.text=element_text(size=10)) + 
    coord_flip() + 
    scale_fill_gradientn(colours=c("#EBCCD6","#E09898","#C74747","#B20000","#E0E0FF"), 
         breaks=seq(0,10,2)) 

enter image description here

+0

спасибо eipi10. Я использовал scale_fill_manual, поэтому цвета штрихов в графике соответствуют их значениям в data.frame. Итак, как мне получить это право в дополнение к заполнению легенды? – dan

+0

Для сюжета 'p1a' установите цвета как scale_fill_manual (значения = c (" # E0E0FF "," # EBCCD6 "," # E09898 "," # C74747 "," # B20000 "))'. Ключ должен поместить цвета в том же порядке, что и соответствующие категории «log10.p.value.cat». Поскольку 'log10.p.value.cat' является фактором, вы можете получить порядок категорий с' levels (df $ log10.p.value.cat) '. Я обновил свой ответ соответственно. – eipi10

Смежные вопросы