假设我在 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()
我想只有一个图例,正确显示形状,颜色和线类型(交互(类型,方法)图例是最接近我想要的,但它没有正确的形状/线类型)。
我知道如果我使用 scale _ xxx _ Manual 并为所有图例指定相同的标签,它们将被合并,但我不想手动设置标签: 如果有新的方法或类型,则不需要修改代码: a want something general。
正如下面的答案所指出的,在这种特殊情况下,有几种方法可以完成工作。所有建议的解决方案都需要手动设置图例线类型和形状,无论是使用 scale_xxx_manual function
还是使用 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/method3组合的数据)