如何在具有不同数据帧的 ggplot 中创建线型图例
How to create a linetype legend in ggplot with different dataframes
一段时间以来,我一直在努力在我的 ggplot 中创建图例,但我找不到任何有效的答案。
这是我的 ggplot 的精简版:
ggplot() +
geom_smooth(data = mydf1, aes(x, predicted, linetype = 1), method = "lm", linetype = 1, colour = "black") +
geom_smooth(data = mydf2, aes(x, predicted, linetype = 2), method = "lm", linetype = 2, colour = "black") +
geom_smooth(data = mydf3, aes(x, predicted, linetype = 3), method = "lm", linetype = 3, colour = "black") +
theme_classic()
如您所见,我从不同的数据帧(mydf1、mydf2、mydf3)获取数据。现在我想手动添加一个图例,指定实线为“第 1 组”,长虚线为“第 2 组”,虚线为“第 3 组”。但是,无论我尝试什么,我的 ggplot 中都没有图例出现。我在 aes() 中包含了线型,尝试了所有我能想到的关于 scale_linetype_manual() 的方法,我一直在四处寻找解决方案,但没有弹出图例。
我是不是遗漏了什么明显的东西?我只需要一个小图例说明不同线型的含义。
我的数据如下:
mydf1 <- data.frame(x = c(seq(-1,1, 0.2)),
predicted = c(-0.27066438, -0.23568714, -0.20070991, -0.16573267, -0.13075543, -0.09577819, -0.06080095, -0.02582371, 0.00915353, 0.04413077, 0.07910801))
mydf2 <- data.frame(x = c(seq(-1,1, 0.2)),
predicted = c(-0.39806988, -0.34348641, -0.28890295, -0.23431948, -0.17973602, -0.12515255, -0.07056909, -0.01598562, 0.03859784, 0.09318131, 0.14776477))
mydf3 <- data.frame(x = c(seq(-1,1, 0.2)),
predicted = c(-0.25520076, -0.22917917, -0.20315758, -0.17713600, -0.15111441, -0.12509282, -0.09907123, -0.07304964, -0.04702806, -0.02100647, 0.00501512))
尽管任何实用的解决方案都会有所帮助,但我并不一定要将数据帧组合成一个数据帧并重做 ggplot。谢谢!
将线型放入 aes() 并使用 lab() 为图例提供标题。
ggplot() +
geom_smooth(data = mydf1, aes(x, predicted, linetype = "Group 1"), method = "lm", colour = "black") +
geom_smooth(data = mydf2, aes(x, predicted, linetype = "Group 2"), method = "lm", colour = "black") +
geom_smooth(data = mydf3, aes(x, predicted, linetype = "Group 3"), method = "lm", colour = "black") +
labs(linetype="Group") +
theme_classic()
这是使用 bind_rows
的替代方法:
library(dplyr)
library(ggplot2)
bind_rows(mydf1, mydf2, mydf3) %>%
mutate(group = as.integer(gl(n(), 11, n()))) %>%
ggplot(aes(x, predicted, linetype=factor(group)))+
geom_smooth(color="black", method = "lm", se=F) +
scale_linetype_discrete(name="group",
breaks=c(1, 2, 3),
labels = c("group1", "group2", "group3"))+
theme_classic()
一段时间以来,我一直在努力在我的 ggplot 中创建图例,但我找不到任何有效的答案。
这是我的 ggplot 的精简版:
ggplot() +
geom_smooth(data = mydf1, aes(x, predicted, linetype = 1), method = "lm", linetype = 1, colour = "black") +
geom_smooth(data = mydf2, aes(x, predicted, linetype = 2), method = "lm", linetype = 2, colour = "black") +
geom_smooth(data = mydf3, aes(x, predicted, linetype = 3), method = "lm", linetype = 3, colour = "black") +
theme_classic()
如您所见,我从不同的数据帧(mydf1、mydf2、mydf3)获取数据。现在我想手动添加一个图例,指定实线为“第 1 组”,长虚线为“第 2 组”,虚线为“第 3 组”。但是,无论我尝试什么,我的 ggplot 中都没有图例出现。我在 aes() 中包含了线型,尝试了所有我能想到的关于 scale_linetype_manual() 的方法,我一直在四处寻找解决方案,但没有弹出图例。
我是不是遗漏了什么明显的东西?我只需要一个小图例说明不同线型的含义。
我的数据如下:
mydf1 <- data.frame(x = c(seq(-1,1, 0.2)),
predicted = c(-0.27066438, -0.23568714, -0.20070991, -0.16573267, -0.13075543, -0.09577819, -0.06080095, -0.02582371, 0.00915353, 0.04413077, 0.07910801))
mydf2 <- data.frame(x = c(seq(-1,1, 0.2)),
predicted = c(-0.39806988, -0.34348641, -0.28890295, -0.23431948, -0.17973602, -0.12515255, -0.07056909, -0.01598562, 0.03859784, 0.09318131, 0.14776477))
mydf3 <- data.frame(x = c(seq(-1,1, 0.2)),
predicted = c(-0.25520076, -0.22917917, -0.20315758, -0.17713600, -0.15111441, -0.12509282, -0.09907123, -0.07304964, -0.04702806, -0.02100647, 0.00501512))
尽管任何实用的解决方案都会有所帮助,但我并不一定要将数据帧组合成一个数据帧并重做 ggplot。谢谢!
将线型放入 aes() 并使用 lab() 为图例提供标题。
ggplot() +
geom_smooth(data = mydf1, aes(x, predicted, linetype = "Group 1"), method = "lm", colour = "black") +
geom_smooth(data = mydf2, aes(x, predicted, linetype = "Group 2"), method = "lm", colour = "black") +
geom_smooth(data = mydf3, aes(x, predicted, linetype = "Group 3"), method = "lm", colour = "black") +
labs(linetype="Group") +
theme_classic()
这是使用 bind_rows
的替代方法:
library(dplyr)
library(ggplot2)
bind_rows(mydf1, mydf2, mydf3) %>%
mutate(group = as.integer(gl(n(), 11, n()))) %>%
ggplot(aes(x, predicted, linetype=factor(group)))+
geom_smooth(color="black", method = "lm", se=F) +
scale_linetype_discrete(name="group",
breaks=c(1, 2, 3),
labels = c("group1", "group2", "group3"))+
theme_classic()