【问题标题】:ggplot2: Shape, Color and Linestyle into one legendggplot2:将形状、颜色和线型融为一个图例
【发布时间】:2014-06-14 03:10:06
【问题描述】:

我想创建一个带有线条和条形的 ggplot2 图,可视化不同的值 y 和 ybar。这些线也基于值 y 被点覆盖。最后应该有 2 个图例,一个用于线(+点)图,包括颜色、形状和线条样式,一个用于条形图,包括填充颜色。线条样式、点形状和颜色会根据变量类型(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() 会产生类似的结果。

我浏览了相关的帖子,并没有找到这个复杂情况的答案。

【问题讨论】:

    标签: r ggplot2 legend


    【解决方案1】:

    我认为这可以满足您的要求:

    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"))
    

    看起来问题是形状和线条大小仍在图例中使用其原始名称进行标记,因此您只需添加说明以将它们标记为与其他“线条图例”参数相同。

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

    【讨论】:

    • 这完成了工作。太感谢了! +1 出色的解释。
    猜你喜欢
    • 2022-11-27
    • 2016-07-13
    • 2021-09-05
    • 2022-09-27
    • 2014-10-24
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多