手动缩放多个geoms的颜色,形状和线型ggplot2

时间:2017-11-29 20:43:32

标签: r ggplot2

找到问题的部分解决方案here。我将展示该解决方案的工作原理以及仍然缺乏哪些功能来满足我的需求。为了保持一致性,我使用的示例数据集类似于另一个线程中的示例数据集:

library(ggplot2)
library(reshape2)
library(tidyverse)

df <- data.frame(x = c(1:5), a = c(1,2,3,3,3), b = c(1,1.1,1.3,1.5,1.5))
df <- mutate(df, log2 = log2(x))
df <- df <- melt(df, c("x", "log2"))

数据的初始图(由以下代码创建)在单独的图例中具有shapecolor美学,这是不可取的:

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)"), size = 1.5)

解决方案建议使用guides()override.aes将这些组合成单个图例,这肯定是对原始图表的改进:

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) +
  guides(shape = FALSE,
         colour = guide_legend(override.aes = list(shape = c(16, 17, NA),
                                                   linetype = c("blank", "blank", "solid"))))

我的问题是,我想在colorgeom_point中手动控制geom_line美学。例如,我想让三角形变为灰色,圆形为深灰色,log2(x)线为浅蓝色。我对guides()如何运作的理解是非常有限的,所以我能做的最好的是:

ggplot(df) +
  geom_point(aes(x, value, shape = variable), color = "gray40", size = 3, data = filter(df, variable == "a")) +
  geom_point(aes(x, value, shape = variable), color = "gray70", size = 3, data = filter(df, variable == "b")) +
  geom_line(aes(x, log2, shape = "log2(x)"), color = "cadetblue2", size = 1.5) +
  guides(shape = guide_legend(override.aes = list(color = c("gray40", "gray70", "cadetblue2"),
                                                  shape = c(16, 17, NA),
                                                  linetype = c("blank", "blank", "solid"))))

这似乎是shapegeom_line审美的不当使用(假设产生了警告),但是几乎我想要的结果。现在的问题是缺少log2(x)的图例图标。理想情况下,它应显示与绘图匹配的水平浅蓝色线条。有谁知道如何实现这一点和/或可以更好地解释如何使用guides()函数?

我还尝试使用scale_color_manual()scale_linetype_manual()scale_shape_manual()的组合解决方案(都具有相同的name参数,这样它们应该最终成为一个传说)。这种方法的问题在于,所有3个geom图层都具有color美学,但只有前两个具有shape美学,只有最后一个具有linetype美学。因此,即使scale_xx_manual()的所有ggplot次添加都已正确设置,图例也不会合并为一个。

我已经坚持了很长时间,所以任何帮助都会非常感激。谢谢

1 个答案:

答案 0 :(得分:4)

只需创建手动色标,即可更改绘图和指南中的颜色。一般而言,您总是希望使用比例来覆盖指南值,因为它可以消除指南中出错的风险,这可能会导致您的可视化产生谎言。

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) +
  scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) +
  guides(shape = FALSE,
         colour = guide_legend(override.aes = list(shape = c(16, 17, NA),
                                                   linetype = c("blank", "blank", "solid"))))

编辑:

这里的版本也避免在形状上执行指南覆盖:

ggplot(df) +
  geom_point(aes(x, value, colour = variable, shape = variable, linetype = variable), size = 3) +
  geom_line(aes(x, log2, color = "log2(x)", linetype = "log2(x)", shape = "log2(x)"), size = 1.5) +
  scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) +
  scale_shape_manual(values = c("a" = 16, "b" = 17, "log2(x)" = NA)) +
  scale_linetype_manual(values = c("a" = "blank", "b" = "blank", "log2(x)" = "solid"))
当名称,标签和方向相同(12)时,

ggplot会自动合并图例,因此您只需要确保&#34; a&#34 ;,&#34; b&#34;和&#34; log2(x)&#34;所有都以相同的顺序映射到每个美学。在这种情况下,我们通过向图层添加不必要的映射并忽略警告来实现此目的。