【问题标题】:ggplot2 - single guide for colour and line, without knowing the name of each seriesggplot2 - 颜色和线条的单一指南,不知道每个系列的名称
【发布时间】:2016-08-05 03:47:19
【问题描述】:

我想使用填充和颜色创建一个包含多个几何图形(例如 geom_line 和 geom_bar)的绘图,但只有一个单一的综合指南,而不是一个用于填充的指南和另一个用于颜色的指南。

更复杂的是,这是一个让用户上传数据的应用程序的一部分,所以我不知道每个系列的名称,也不知道会有多少。所以需要自动生成指南。

我看到的示例都使用scale_colour_manualscale_colour_fill,但这假设您知道该系列的名称。例如:ggplot2 merge color and fill legends

我试图查看完成的情节的结构,看看我是否可以手动提取系列名称(以及它们的颜色等),但在任何地方都看不到。

这是一些测试数据。我正在使用“组”列来决定它是否应该在线条或条形几何中。

testdt <- data.table(
   x = rep(c(1,2), each = 4),
   name = c("a", "b", "c", "d"),
   value = c(1,2,3,4,5,6,7,8),
   group = c(1,2)
)

ggplot(data = testdt, aes(x = x, y = value)) +
  geom_line(data = testdt[group == 1], aes(colour = name)) +
  geom_bar(data = testdt[group == 2], aes(fill = name), stat = "identity")

这个例子产生了两个图例;两者都称为“name”,一个显示“a”和“c”行,另一个显示“b”和“d”区域。

编辑 - 阐明它应该是什么样子

这是之前的图片:

这就是我想要的样子:

【问题讨论】:

  • 那么传奇究竟会是什么样子呢?传说中的颜色会写什么“名字”?您想同时显示填充颜色和线条颜色吗?你会如何结合这些?
  • 如果您将name 转换为一个因子,然后将scale_color_discrete(drop=FALSE)scale_fill_discrete(drop=FALSE) 添加到您的绘图中,只要填充和颜色美学使用相同,您就会得到一个图例柱子。但是,这可能无法涵盖您所有的潜在用例。
  • @MrFlick 我已经编辑包含 png 以显示我希望它的外观。谢谢

标签: r ggplot2


【解决方案1】:

这是获取您要求的图例的一种老套方法,但它是硬编码的。鉴于您的具体情况,您仍然需要找到一种概括它的方法。基本上,我们只需关闭填充图例并使用override.aescolor 图例创建交替的细线和粗线,其中粗线模拟图例的填充组件。 (虽然这对于您的一般情况可能不够灵活。)

如果相同的列用于填充和颜色美学,那么你不需要知道实际的列名来获取单个图例,只要你使用drop=FALSE 来确保两个几何保持所有级别,甚至那些不存在于用于该几何的数据子集中的那些。 (但用户是否不必在沿途某处选择要用于绘图的列?这些列名难道不是您可以在需要时捕获的函数的参数吗?)对于drop=FALSE要工作,填充/颜色列需要先转换为因子。

概括地说,您需要代码来获取子集列(在本例中为group)的每个级别的颜色/填充列(在本例中为name)的不同级别的数量。然后您可以使用这些来确定调用scale_xxx_manual 时需要多少种颜色。

这是硬编码的版本:

# Code name as a factor so that drop=FALSE will work
testdt$name = factor(testdt$name)

ggplot(data = testdt, aes(x = x, y = value)) +
  geom_line(data = testdt[group == 1], aes(colour = name)) +
  geom_bar(data = testdt[group == 2], aes(fill = name), stat = "identity", show.legend=FALSE) +
  scale_color_manual(values=rep(hcl(c(15,195),100,65),each=2), drop=FALSE) +
  scale_fill_manual(values=rep(hcl(c(15,195),100,65),each=2), drop=FALSE) +
  guides(color=guide_legend(override.aes=list(size=c(1,7,1,7)))) 

【讨论】:

  • 非常感谢。我将能够提取列名,但是在调用 ggplot 之前有一些预处理,所以......这很复杂。如果 ggplot 有将图例转储为列表的功能会更好,但这是非常可行的。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多