使用 ggplot2 创建带有形状的图例

Posted

技术标签:

【中文标题】使用 ggplot2 创建带有形状的图例【英文标题】:Creating a legend with shapes using ggplot2 【发布时间】:2022-01-16 02:31:19 【问题描述】:

我已经为绘制了四条拟合线和对应点的图表创建了以下代码。我对传说有问题。由于某种原因,我找不到将点的不同形状分配给变量名的方法。此外,颜色与图表中的实际颜色不一致。

y1 <- c(1400,1200,1100,1000,900,800)
y2 <- c(1300,1130,1020,970,830,820)
y3 <- c(1340,1230,1120,1070,940,850)
y4 <- c(1290,1150,1040,920,810,800)

df <- data.frame(x,y1,y2,y3,y4)


g <- ggplot(df, aes(x=x), shape="shape") +
  geom_smooth(aes(y=y1), colour="red", method="auto", se=FALSE) + geom_point(aes(y=y1),shape=14) +
  geom_smooth(aes(y=y2), colour="blue", method="auto", se=FALSE) + geom_point(aes(y=y2),shape=8) +
  geom_smooth(aes(y=y3), colour="green", method="auto", se=FALSE) + geom_point(aes(y=y3),shape=6) +
  geom_smooth(aes(y=y4), colour="yellow", method="auto", se=FALSE) + geom_point(aes(y=y4),shape=2) +
  ylab("x") + xlab("y") + labs(title="overview")
  geom_line(aes(y=1000), linetype = "dashed")
  theme_light() +
  theme(plot.title = element_text(color="black", size=12, face="italic", hjust = 0.5)) +
  scale_shape_binned(name="Value g", values=c(y1="14",y2="8",y3="6",y4="2"))

print(g)

我想知道为什么颜色不匹配,以及如何构建这样一个图例,以便清楚哪个形状对应于哪个变量名。

【问题讨论】:

【参考方案1】:

虽然您可以通过scale_shape_manual 手动添加图例,但也许适当的解决方案是重塑您的数据(尝试在y1:y4 变量上使用tidyr::pivot_longer()),然后将生成的变量分配给形状美学(您然后可以根据自己的喜好手动设置颜色)。然后,您需要使用一个 geom_point()geom_smooth() 而不是每个四个。

另外,您缺少一个可重现的示例(x 的值是多少?)并且您的代码在尝试执行黄土平滑时发出了一些警告(因为数据点比执行它所需的少)。

更新(2021-12-12) 这是一个可重现的示例,其中我们重塑原始数据并使用其aes() 函数将其提供给ggplot,以自动为每个“y 组”绘制不同的geom_pointgeom_smooth。我为x 变量编写了值。

library(ggplot2)
library(tidyr)

x <- 1:6
y1 <- c(1400,1200,1100,1000,900,800)
y2 <- c(1300,1130,1020,970,830,820)
y3 <- c(1340,1230,1120,1070,940,850)
y4 <- c(1290,1150,1040,920,810,800)

df <- data.frame(x,y1,y2,y3,y4)

data2 <- df %>%
  pivot_longer(y1:y4, names_to = "group", values_to = "y")

ggplot(data2, aes(x, y, color = group, shape = group)) +
  geom_point(size = 3) +    # increased size for increased visibility
  geom_smooth(method = "auto", se = FALSE)

在 RStudio 中逐行运行代码并使用它来检查data2。我认为结果输出会更有意义:

另一个更新

Freek19,在您的第二个示例中,您需要手动指定形状和颜色比例,以便 ggplot2 认为它们是相同的,如下所示:

library(ggplot2)

data <- ... # from your previous example

ggplot(data, aes(x, y, shape = group, color = group)) +
  geom_smooth() +
  geom_point(size = 3) +
  scale_shape_manual("Program type", values=c(1, 2, 3,4,5)) +
  scale_color_manual("Program type", values=c(1, 2, 3,4,5))

希望这会有所帮助。

【讨论】:

感谢您的回答!你能详细说明一下吗?为什么重塑数据会有所帮助,为什么我只需要一个 geom_point 和 geom_smooth? x 的值只是某个函数的输入值。我有四个不同的输出向量,每个向量对应于我函数中某个参数的特定值。我尝试使用 pivot_longer,但我真的不明白它会有什么帮助 我用一个可以在 R 中运行的示例更新了帖子。 我再次更新了帖子,为重复的图例提供了解决方案。简而言之,一旦您指定了形状比例的标题,ggplot 就会认为它与颜色比例不同,并绘制两者。解决方案是手动指定两个比例,完全相同(然后 ggplot 将只渲染一个,因为它会正确假设它们是相同的比例)。【参考方案2】:

我设法接近我想要的,使用:


library(ggplot2)


data <- data.frame(x = c(0,0.02,0.04,0.06,0.08,0.1),
                   y = c(1400,1200,1100,1000,910,850, #y1
                         1300,1130,1010,970,890,840,  #y2
                         1200,1080,980,950,880,820, #y3
                         1100,1050,960,930,830,810, #y4
                         1050,1000,950,920,810,800), #y5
                   
                   group = rep(c("5%","6%","7%","8%","9%"), each = 6))
data

Values <- ggplot(data, aes(x, y, shape = group, color = group)) +    # Create line plot with default colors
  geom_smooth(aes(color=group)) + geom_point(aes(shape=group),size=3) +
  scale_shape_manual(values=c(1, 2, 3,4,5))+
  geom_line(aes(y=1000), linetype = "dashed") +
  ylab("V(c)") + xlab("c") + labs(title="Valuation")+
  theme_light() +
  theme(plot.title = element_text(color="black", size=12, face="italic", hjust = 0.5))+
  labs(group="Program Type")

Values

我只停留在 2 个传说中。我想更改两个名称,否则它们会重叠。但是我不确定如何执行此操作。

【讨论】:

请看更新后的答案,我觉得可以帮到你。

以上是关于使用 ggplot2 创建带有形状的图例的主要内容,如果未能解决你的问题,请参考以下文章

使用ggplot2为甘特图创建图例

ggplot2 没有坐标轴、图例等的绘图

R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出保留数据点形状图例输出

R语言ggplot2可视化调整图例中的形状符号大小实战

在 ggplot2 中,使用两种图形类型时如何缩放图例?

ggplot2 - 在大小图例中显示多个键(形状)