使用 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_point
和geom_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 创建带有形状的图例的主要内容,如果未能解决你的问题,请参考以下文章