如何在ggplot2条形图中添加图例

时间:2014-08-30 16:40:37

标签: r ggplot2

我试图在ggplot2中设计一个漂亮的图形,通过使用条形来显示某些时期的不同值。我得到了图形,但我无法在图表的严格侧面添加图例。我的数据框DF有3个变量Month,variable,value。这些变量是另一个数据中melt()函数的结果(我在最后一部分中添加了dput()版本的DF)。所以,我的数据框DF看起来像这样:

   Month variable     value
1     m2    Power 1258978.9
2     m3    Power 1608317.4
3     m4    Power 1293821.1
4     m5    Power 1819283.8
5     m6    Power 1436552.9
6     m7    Power  875170.3
7     m8    Power 1315856.2
8     m9    Power  710004.3
9    m10    Power  889398.1
10   m11    Power 1114883.1
11   m12    Power 1419242.1
12   m13    Power 1585857.2
13   m14    Power 1010455.6
14   m15    Power 1292333.4

要显示value变量month的演变,我使用了以下代码:

library(ggplot2)
library(scales)
ggplot(DF, aes(x = Month, y = value))+geom_bar(position="identity",fill="#FF6C91",colour="black",size=1)+ scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7),limits=c(0,max(DF$value,na.rm=T)))+
  theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12),axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15),axis.title.x=element_text(colour="grey20",face="bold",size=16),axis.title.y=element_text(colour="grey20",face="bold",size=16))+xlab('Month')+ylab('')+ ggtitle("My graph")+theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24))+theme(legend.text=element_text(size=14),legend.title=element_text(size=14))

使用此代码,我得到了下一个图形: enter image description here

结果几乎是完美的但我不知道如何在图表的右侧添加相同颜色的条形图例以在此图像中提供更多信息。我试图在fill内添加geom_bar参数,但我无法得到我希望的结果。 dput()的{​​{1}}版本是下一个:

DF

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:3)

您只需要填写aes理论映射的填充部分:

gg <- ggplot(DF, aes(x=Month, y=value))
gg <- gg + geom_bar(stat="identity", aes(fill=variable), colour="black", size=1)
gg <- gg + scale_y_continuous(labels=comma, breaks=pretty_breaks(n=7),
                              limits=c(0, max(DF$value,na.rm=T)))
gg <- gg + scale_fill_manual(values="#FF6C91", name="Legend name")
gg <- gg + labs(x="Month", y="", title="My graph")
gg <- gg + theme(plot.title=element_text(lineheight=3, face="bold", color="black", size=24))
gg <- gg + theme(legend.text=element_text(size=14), legend.title=element_text(size=14))
gg <- gg + theme(axis.text.x=element_text(angle=90, colour="grey20", face="bold", size=12), 
                 axis.text.y=element_text(colour="grey20", face="bold", hjust=1, vjust=0.8, size=15),
                 axis.title.x=element_text(colour="grey20", face="bold", size=16),
                 axis.title.y=element_text(colour="grey20", face="bold", size=16))
    gg

enter image description here

注意:我将position="identity"更改为stat="identity"(我认为你确实错误地粘贴了它,因为你确实让它工作了),重新构造了ggplot以便于修改(程序员的偏好) ,没有必要使其工作)然后在将填充美学映射到变量后进行手动缩放(并且您也可以在那里重命名图例标题,如图所示)。这是自动启用图例的映射。我还提出了一个theme_bw()号召,以获得良好的衡量标准(以及克服灰色背景)。

我会将x轴标签旋转回水平,但也不想强加它。通常不建议人们倾向于阅读标签,但由于它们只是m和数字,所以可能不会那么难。

可能值得对条形图进行排序(从最低到最高,反之亦然),除非您需要按照它们在x轴上的顺序排序(即m10 - m9顺序现在很重要。)

答案 1 :(得分:0)

您需要将fill映射到美学以强制传奇。从那里,您可以使用scale_fill_manual

添加所需的任何其他信息

这是代码(注意我在月份之外制作了一个因子,所以x轴是有序的,或者至少是我想要的顺序):

DF$Month2 <- factor(DF$Month, levels = paste0("m", 2:15))

ggplot(DF, aes(x = Month2, y = value, fill = variable)) +
  geom_bar(stat="identity",colour="black",size=1) + #NOTE - you need stat = identity, not position
  scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7),
                     limits=c(0,max(DF$value,na.rm=T))) +
  theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12),
        axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15),
        axis.title.x=element_text(colour="grey20",face="bold",size=16),
        axis.title.y=element_text(colour="grey20",face="bold",size=16)) +
  xlab('Month')+ylab('')+ ggtitle("My graph") +
  theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24)) +
  theme(legend.text=element_text(size=14),
        legend.title=element_text(size=14)) +
  scale_fill_manual(name = "This is stuff I made up", 
                    label = "This is stuff I made up II", 
                    values = "#FF6C91")

给你:

enter image description here

答案 2 :(得分:0)

和其他人一样&#39;如上所述,您需要fill中指定的aes。这是另一个版本,还有一些其他选项供您考虑(图例名称,标签和位置等):

ForLeg=c(Power="#FF6C91");
    ggplot(DF, aes(x = Month, y=value, fill=as.factor(variable)))+
      geom_bar(stat="Identity",colour="black",size=1)+ 
      scale_fill_manual(values=ForLeg, labels="The value")+
      scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7),limits=c(0,max(DF$value,na.rm=T)))+
      theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12),axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15),axis.title.x=element_text(colour="grey20",face="bold",size=16),axis.title.y=element_text(colour="grey20",face="bold",size=16))+
      xlab('Month')+
      ylab('')+ 
      ggtitle("My graph")+
      theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24))+
      theme(legend.position="top",legend.text=element_text(size=14),legend.title=element_text(size=14))+
      guides(fill=guide_legend(title="",keywidth = 2, keyheight = 1,title.position = "left",title.hjust = -0.28))

使用如下图表: enter image description here