如何合并颜色,线条风格和形状图例在 ggplot

假设我在 ggplot 中有以下情节:

ggplot graph

它是使用以下代码生成的:

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)

这意味着:

5 curves

现在的问题是: 如何自动生成 override.shapeoverride.linetype向量?

注意,向量大小是5,因为我们有5条曲线,而 interaction(Type, Method)因子的大小是6(我没有 cos/method3组合的数据)

63745 次浏览

关于 传说的 R 食谱部分解释道:

如果你同时使用颜色和形状,它们都需要给定比例 规格。否则将有两个独立的传说。

在你的情况下,你需要规格为 shapelinetype

剪辑

使用相同的数据创建形状颜色和线条非常重要,我通过直接定义列结合了您的交互阶段。我没有使用 scale_linetype_discrete来创建图例,而是使用 scale_linetype_manual来指定值,因为默认情况下它们将采用四个不同的值。

如果您想要所有可能的形状和线条类型的详细布局,请选中 这个 R 图形网站以查看所有的数字标识符:

df.merged$int <- paste(df.merged$Type, df.merged$Method, sep=".")


ggplot(df.merged, aes(x, y, colour = int, linetype=int, shape=int)) +
geom_line() +
geom_point() +
scale_colour_discrete("") +
scale_linetype_manual("", values=c(1,2,1,2)) +
scale_shape_manual("", values=c(17,17,16,16))

enter image description here

如果我理解你的问题,下面的代码会产生你想要的图例,但是我不确定我是否理解标签问题,所以如果这不是你想要的,请告诉我。

p = ggplot(df.merged, aes(x, y, colour=interaction(Type, Method),
linetype=interaction(Type, Method),
shape=interaction(Type, Method))) +
geom_line() +
geom_point()


p + scale_shape_manual(values=rep(16:17, 2)) +
scale_linetype_manual(values=rep(c(1,3),each=2))

enter image description here

以下是一般情况下的解决方案:

# Create the data frames
x <- seq(0, 10, by = 0.2)
y1 <- sin(x)
y2 <- cos(x)
y3 <- cos(x + pi / 4)
y4 <- sin(x + pi / 4)
y5 <- 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"))
df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3"))


# Merge the data frames
df.merged <- rbind(df1, df2, df3, df4, df5)


# Create the interaction
type.method.interaction <- interaction(df.merged$Type, df.merged$Method)


# Compute the number of types and methods
nb.types <- nlevels(df.merged$Type)
nb.methods <- nlevels(df.merged$Method)


# Set the legend title
legend.title <- "My title"


# Initialize the plot
g <- ggplot(df.merged, aes(x,
y,
colour = type.method.interaction,
linetype = type.method.interaction,
shape = type.method.interaction)) + geom_line() + geom_point()
# Here is the magic
g <- g + scale_color_discrete(legend.title)
g <- g + scale_linetype_manual(legend.title,
values = rep(1:nb.types, nb.methods))
g <- g + scale_shape_manual(legend.title,
values = 15 + rep(1:nb.methods, each = nb.types))
# Display the plot
print(g)

结果如下:

The solution

  • 正弦曲线绘制为实线,正弦曲线绘制为虚线。
  • “方法1”数据使用填充圆圈的形状。
  • “方法2”数据使用填充三角形的形状。
  • “ method3”数据使用填充钻石的形状。
  • 图例与曲线吻合

总而言之,诀窍在于:

  • 对于所有数据表示形式(颜色、形状、, 类型等)
  • 然后手动设置曲线样式和图例样式 scale_xxx_manual.
  • scale_xxx_manual允许您提供一个长于实际曲线数的值向量,因此很容易从 Type 和 Method 因子的大小计算样式向量值

一个只需要命名两个指南相同。例如:

g+ scale_linetype_manual(name="Guide1",values= c('solid', 'solid', 'dotdash'))+
scale_colour_manual(name="Guide1", values = c("blue", "green","red"))

使用 labs()并为定义 geoms 外观的所有美学设置相同的值。

library('ggplot2')
ggplot(iris) +
aes(x = Sepal.Length, y = Sepal.Width,
color = Species, linetype = Species, shape = Species) +
geom_line() +
geom_point() +
labs(color  = "Guide name", linetype = "Guide name", shape = "Guide name")