如何防止ggplot2组合关键字形?

ggplot2 组合了相同比例的字形,这会导致在使用geom_hlinegeom_vline显示两条垂直线时出现混淆行为,因为每种颜色的关键字形包含一个十字 ( +) 而不是|-对应于该颜色。如何防止ggplot组合-|关键字形?

library(ggplot2)
means = as.data.frame(t(colMeans(mtcars)))

(
    ggplot(mtcars, aes(x = disp, y = drat))
    + geom_point()
    + geom_hline(data = means, aes(color = 'average disp', yintercept = drat))
    + geom_vline(data = means, aes(color = 'average drat', xintercept = disp))
)

我尝试key_glyphgeom_vline和明确设置,geom_hline但它没有改变任何东西。

注意:除了易于解释之外,这对于创建适合色盲的绘图至关重要。

回答

我脑海中可能出现的黑客攻击:

  1. 将形状图例(带有水平和垂直线)伪装成颜色图例(优点:比以下方法少手动操作;缺点:难以将形状美感映射到其他任何东西)

  2. 通过 将 ggplot2 对象转换为 grob 对象ggplotGrob,并删除那里的水平/垂直线段的有问题的 grob(优点:不影响任何其他美学或需要其他包;缺点:需要熟悉每个绘图的 grob 修改和手动工作)

  3. 仅使用所需的图例项创建单独的图,然后使用许多可用的包之一将图例组合在一起,例如patchworkcowplot(pro:可以处理所需图例的任何组合;con:需要熟悉其他包 + 手动调整情节的出现)

我还没有考虑修改底层的 ggplot 代码本身,因为我觉得在大多数情况下,组合字形是一个理想的结局。水平线垂直线的图例是一个有效的例外,但不是特别常见的例外。所以我现在会使用hacks。

下面第一个 hack 的演示:

ggplot(mtcars, aes(x = disp, y = drat)) + 
  geom_point() + 
  geom_hline(data = means, aes(color = 'average disp', yintercept = drat),
             show.legend = F) +
  geom_vline(data = means, aes(color = 'average drat', xintercept = disp),
             show.legend = F) +
  geom_point(data = data.frame(val = c(means$drat, means$disp), 
                               name = c("average disp", "average drat")),
             aes(x = 150, y = 3, # arbitrary values, anything within the plot's range
                 color = name, shape = name),
             alpha = 0,          # don't actually show the point in the plot
             size = 5,           # adjust size / stroke to suit your plot's size
             stroke = 2) +
  scale_shape_manual(name = "colour",
                     values = c("average disp" = "U2014", # horizontal line
                                "average drat" = "U007C"),# vertical line
                     guide = guide_legend(override.aes = list(alpha = 1)))


以上是如何防止ggplot2组合关键字形?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>