ggplot2:将形状、颜色和线条样式合并到一个图例中

3
我想创建一个包含线条和柱状图的ggplot2图表,用于可视化不同值y和ybar。这些线条与点基于y值重叠。最终应该有两个图例,一个用于线条(+ 点)图表,包括颜色,形状和线型,另一个用于柱状图,包括填充颜色。根据变量类型(y1或y2),线条样式、点形状和颜色会相应更改。这很好用,直到我手动设置图例名称和项目标签为止:
数据框初始化的最小代码:
library(ggplot2)
library(reshape)
df = data.frame(c(10,20,40),c(0.1,0.2,0.3),c(0.1,0.4,0.5),c(0.05,0.1,0.2),c(0,0.2,0.4))
names(df)[1]="classes"
names(df)[2]="y1"
names(df)[3]="y2"
names(df)[4]="bary1"
names(df)[5]="bary2"
df$classes <- factor(df$classes,levels=c(10,20,40), labels=c("10m","20m","40m"))

创建点、线和柱状图的最简代码:

dfMelted <- melt(df)
diagram <- ggplot()
diagram <- diagram + theme_bw(base_size=16)
diagram <- diagram + geom_bar(data=subset(dfMelted,variable=="bary1" | variable=="bary2"), aes(x=factor(classes),y=value, fill=variable),stat="identity",position="dodge")
diagram <- diagram + geom_point(data=subset(dfMelted,variable=="y1" | variable=="y2"), size=4, aes(x=factor(classes),y=value, colour=variable, shape=variable)) 
diagram <- diagram + geom_line(data=subset(dfMelted,variable=="y1" | variable=="y2"), aes(x=factor(classes),y=value, group=variable, colour=variable, linetype=variable))

初步结果:

目前看起来不错

通过以下代码设置图例名称/项目标签:

diagram + scale_colour_brewer(name="Line Legend",labels=c("Foo","Bar")) + scale_fill_brewer(name="Bar Legend",labels=c("Foo Bar","Bar Bar"))

产生了不希望的结果:
在最终结果中,两个期望的图例被分成了三个。再也没有统一颜色、线型和点形状的图例了。为什么会这样?如何解决?同时使用scale_colour_manual()和scale_shape_manual()也会产生类似的结果。
我浏览了相关的帖子,但没有找到解决这种复杂情况的答案。
1个回答

5
我认为这个可以满足你的需求:
diagram + 
  scale_fill_brewer (name = "Bar Legend", labels = c("Foo Bar", "Bar Bar")) +
  scale_colour_brewer     (name = "Line Legend", labels = c("Foo", "Bar")) +
  scale_linetype_discrete (name = "Line Legend", labels = c("Foo", "Bar")) +
  scale_shape_discrete    (name = "Line Legend", labels = c("Foo", "Bar"))

看起来问题在于形状和线条大小仍然被用它们的原始名称标记在图例中,所以你只需要添加指令将它们标记为与其他“线条图例”参数相同即可。

或者,当然,你也可以重命名数据集中的变量...


这个做得很好。非常感谢!因为解释得太好了,所以加一分。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接