假设我有ggplot以下情节:如何合并颜色,线条样式和形状传说中ggplot
x <- seq(0, 10, by = 0.2)
y1 <- sin(x)
y2 <- cos(x)
y3 <- cos(x + pi/4)
y4 <- sin(x + pi/4)
df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1"))
df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1"))
df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2"))
df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2"))
df.merged <- rbind(df1, df2, df3, df4)
ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()
我想:
它是用下面的代码生成喜欢只有一个图例正确显示形状,颜色和线条类型(交互(Type,Method)图例与我想要的最接近,但它没有正确的形状/线条类型)。
我知道,如果我使用scale_xxx_manual和我指定他们将合并所有的传说一样的标签,但我不希望有手动设置标签:如果有新的方法或类型,我不我不想修改我的代码:想要一些通用的东西。
编辑
正如下面的答案指出,有几种方式来获得在这种特殊情况下完成工作。所有建议的解决方案都需要手动设置图例线条类型和形状,可以使用scale_xxx_manual function
s或guides
函数。
但是,所提出的解决方案在一般情况下仍然不起作用:例如,如果我用新的“method3”方法向数据集添加新的数据框,它不再有效,我们必须手动添加新的传奇的形状和线条类型:
y5 <- sin(x - pi/4)
df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3"))
df.merged <- rbind(df1, df2, df3, df4, df5)
override.shape <- c(16, 17, 16, 17, 16)
override.linetype <- c(1, 1, 3, 3, 4)
g <- ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()
g <- g + guides(colour = guide_legend(override.aes = list(shape = override.shape, linetype = override.linetype)))
g <- g + scale_shape(guide = FALSE)
g <- g + scale_linetype(guide = FALSE)
print(g)
这给:
现在的问题是:如何自动生成override.shape
和override.linetype
载体?
注意,矢量大小为5,因为我们有5条曲线,而interaction(Type, Method)
因素有大小6(我没有对COS /方法3组合数据)
您的色阶对于组合形状和线型比例是多余的。你应该只使用其中的一个。 – Roland
是的,它是多余的。起初,我将颜色映射到了类型,并将线型映射到了方法。但是,当曲线彼此靠得太近时,很难区分它们。因此冗余 – Ben
有冗余形状/颜色组定义通常是适当的。在许多科学出版物中,颜色是区分群体最直观有效的方式,但您也知道很大一部分读者将会打印纸张的黑白副本,因此您还需要包含一个视觉提示,取决于颜色。 – neuropsych