添加自定义ggplot图例

时间:2016-05-21 17:15:33

标签: r ggplot2 legend

我试图在我的ggplot中添加自定义图例,类似于以下示例:http://docs.ggplot2.org/0.9.2.1/scale_gradientn.html

我希望绘图中的小条根据df$col列进行着色,因此我使用scale_fill_manualvalues = 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

1 个答案:

答案 0 :(得分: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