【问题标题】:Need second legend in ggplot for geom_hline'sgeom_hline 需要 ggplot 中的第二个图例
【发布时间】:2016-04-28 22:23:27
【问题描述】:

我是 R 的相对新手,我正在编写代码以使用 ggplot2 从一些非常基本的数据创建图表。我的绘图代码目前如下所示:

chart1_data = read.csv(data_file, as.is=T)
chart1_means = read.csv(means_file, as.is=T)

p = ggplot(data=chart1_data, aes(x=entity, y=usage, fill=medicine)) +
geom_bar(stat="identity", position=position_dodge()) +
geom_hline(data=chart1_means, aes(yintercept=value), show.legend=FALSE)

这绘制了一个分组垂直条的图表,黑色水平线穿过代表平均值的条,并有一个图例显示垂直条的颜色编码。

我想做几件事:

  1. 以颜色显示水平线 (geom_hline)(R 具有的默认颜色集,映射到 chart1_means 表中不同数量的线)

  2. 显示第二个图例,显示这些线条颜色并映射到 chart1_means 文件中的第 1 列值,这是一个文本标签。

为清楚起见,chart1_means CSV 文件如下所示:

label,value
USA Codeine mean, 14.2
Canada Codeine mean, 12.7
etc.

chart1_data CSV 文件如下所示:

year,medicine,entity,usage,units
2006,Codeine,Mexico,0.8,mg/capita
2006,Codeine,Cuba,NA,mg/capita
etc.

我在谷歌上搜索了这个,但没有成功。似乎有很多方法可以做类似的事情,但我找不到非常适用的方法。

更新更新更新

我接受了 bethanyP 的建议,设计了一些更接近正确但仍然错误的东西。目前的代码如下所示:

chart1_data = read.csv(data_file, as.is=T)
chart1_means = read.csv(means_file, as.is=T)

means_labels = chart1_means$label
colors = rainbow(length(means_labels))

p = ggplot(data=chart1_data, aes(x=entity, y=usage, fill=medicine)) +
geom_bar(stat="identity", position=position_dodge(), show.legend=TRUE) +
geom_hline(data=chart1_means, aes(yintercept=value), color=colors) +
scale_fill_manual("means", values=colors, guide=guide_legend(override.aes = list(colors)))

结果是彩色线条覆盖了彩色条(很好),但仍然只有一个图例。图例的标题为“手段”(面向线条的数据),但显示了“药物”的颜色和标签(面向条形的数据)。

我想我也许可以这样做:

scale_fill_manual("means", values=colors, labels=means_labels)

但这会用标题“means”、与条形关联的颜色以及作为“means_labels”子集的标签填充单个图例(因为条形比均值线少)。

我几乎陷入了僵局。仍然需要来自两个不同数据系列的两个图例。还有其他建议吗?

【问题讨论】:

    标签: r ggplot2 legend


    【解决方案1】:

    show_guide = TRUE 添加到geom_bar 美学以明确告诉它为主要的legendpurple 的情节内容制作图例。

    + geom_bar(stat="identity", position=position_dodge(), show_guide = TRUE)
    

    您只需将参数color = "red" 添加到geom_hline 中即可获得hline 中的颜色。当您使用它时,添加一个 fill="some text here" 参数来标记您的第二个图例中的线条,尤其是在您添加多条不同颜色的线条时。

    + geom_hline(data=chart1_means, aes(yintercept=value), fill="mean", color="red")
    + geom_hline(data=chart1_sd, aes(yintercept=value), fill="Standard Deviation", color="pcreateurple")
    

    然后您可以使用 scale_fillguide=guide_legend 来让您回家。

    + scale_fill_manual("Means & SD", guide=guide_legend(override.aes = list(color=c('purple", "red")))
    

    )

    如果您将调色板用作容器,您还可以创建一个变量来保存颜色列表,并通过使用变量名称和一个整数来指定列表中的哪种颜色用于每种颜色。

    如果您遇到颜色和线条不在您期望的位置以及图例中有错误内容的问题,请查看您的 ggplot 函数行的顺序。

    如果您在geom_hline 之前有scale_fill_manual,它可能会为错误的美学着色并构建一个传奇,就像您的酒吧一样。剪切和粘贴,直到将它们放在正确的位置。

    ggplot 非常强大,而且完全不直观。我一直随身携带一份备忘单,以帮助解决这些问题。这没有什么可耻的。 Rstudio 有一个不错的。

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2018-10-18
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多