如何防止ggplot2组合关键字形?
ggplot2 组合了相同比例的字形,这会导致在使用geom_hline和geom_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_glyph为geom_vline和明确设置,geom_hline但它没有改变任何东西。
注意:除了易于解释之外,这对于创建适合色盲的绘图至关重要。
回答
我脑海中可能出现的黑客攻击:
-
将形状图例(带有水平和垂直线)伪装成颜色图例(优点:比以下方法少手动操作;缺点:难以将形状美感映射到其他任何东西)
-
通过 将 ggplot2 对象转换为 grob 对象
ggplotGrob,并删除那里的水平/垂直线段的有问题的 grob(优点:不影响任何其他美学或需要其他包;缺点:需要熟悉每个绘图的 grob 修改和手动工作) -
仅使用所需的图例项创建单独的图,然后使用许多可用的包之一将图例组合在一起,例如
patchwork或cowplot(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)))