将图例添加到 ggplot + 将两个 scatter-plots 放到一张图上
Adding legend to ggplot + putting two scatter-plots onto one graph
我一直在尝试添加和修改图例,但是在不同的网站、书籍等上花费了数小时后,我无法做到。
用于生成下图的数据 -> https://1drv.ms/u/s!Ao8fi7Xi8BskhKkDRQUn2zSdcgxofw?e=ki2eaA
library(tidyverse)
library(readr)
library(ggplot2)
library(ggpubr)
library(gridExtra)
library(cowplot)
ggplot(data = StandardCM1, aes_string(x = 'NitriteCon', y = "Absorbance")) +
geom_smooth(method="lm", se=FALSE, aes(color = "red"), formula = y ~ x) +
geom_point(shape = 21, size = 3, colour = "blue", fill = "blue")+
theme(legend.position = "right")+
scale_alpha_manual(name = NULL,
values = c("Standard Curve plot" = "white", "Circles" = "blue"),
breaks = c("Standard Curve Mean Values", "Regression Line"),
guide = guide_legend(override.aes = list(
shape = c(21, NA),
color = "blue") ) )+
scale_y_continuous(breaks = c(0,0.05, 0.10, 0.15, 0.20, 0.25, 0.30))+
scale_x_continuous(breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100))+
stat_cor(label.y = 0.30,
aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~")))+
stat_regline_equation(label.x=0, label.y=0.28)+
ggtitle("Standard Curve") +
xlab("Nitrite Concentration (µM)")+
ylab("Absorbance")
如你所见,具体到R后,它产生了一个奇怪的图例,并不能反映我想解释的东西。我知道在 geom_smooth(method="lm", se=FALSE, aes(color = "red"), formula = y ~ x)
部分 - 我可以将 aes(color = "red")
更改为 aes(alpha = "Fitted"
,但是它根本不会产生任何图例。
我在不同论坛和书籍中看到的示例反映了图表中显示的数据。因此,如果有点、线、三角形等,这些相同的形状就会显示在图例中。然而,在我的场景中(即使我可以产生某种图例),它并没有反映图中呈现的形状。
此外,由于我的数据的性质及其相似性,我想将两个散点图放在一个图中。不幸的是,当我尝试时,我完全没有成功。
这是使用相同数据的第二张图表。
library(tidyverse)
library(readr)
library(ggplot2)
library(ggpubr)
library(gridExtra)
library(cowplot)
ggplot(data = StandardCM1, aes_string(x = 'NitriteCon', y = "Absorbance1")) +
geom_smooth(method="lm", se=FALSE, aes(color = "red"), formula = y ~ x) +
geom_point(shape = 21, size = 3, colour = "blue", fill = "blue")+
scale_y_continuous(breaks = c(0,0.05, 0.10, 0.15, 0.20, 0.25, 0.30))+
scale_x_continuous(breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100))+
stat_cor(label.y = 0.30,
aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~")))+
stat_regline_equation(label.x=0, label.y=0.28)+
ggtitle("Standard Curve") +
xlab("Nitrite Concentration (µM)")+
ylab("Absorbance")
正如你所注意到的,即使我添加了
theme(legend.position = "right") +
scale_alpha_manual(
name = NULL,
values = c("Standard Curve plot" = "white", "Circles" = "blue"),
breaks = c("Standard Curve Mean Values", "Regression Line"),
guide = guide_legend(
override.aes = list(shape = c(21, NA),color = "blue"))
)
部分,R 决定不看它并生成与第一张图相同的图例。我不理解。我知道肯定有一些遗漏的代码,或者它们是错误的,但我找不到它们,因为 R 甚至没有告诉我哪里出了问题。它似乎只是忽略了 'pointless' 值之类的东西。
非常感谢您的宝贵时间和任何可能的帮助。
编辑
卡兹曼,非常感谢您的出色回答;这对我帮助很大。然而,在我的标题中说“将两个 scatter-plot 放到一张图上”,我的意思是 this。因此,我已经安装了 library(cowplot)
和 library(gridExtra)
,它们应该允许我在同一页上放置多个散点图(不仅如此)。
我知道 cowplot
和 gridExtra
是 ggplots2
的扩展,允许我们放置来自 ggplo2
函数的任何类型的乘法图。但在我的场景中,R 再次看不到我的输入。添加后
plot_grid(df1, df2, labels=c("A", "B"), ncol = 2, nrow = 1)
本节下:
ggplot(data = df,
aes(x = NitriteConc,
y = Absorbance)) +
它产生以下错误Here
再次感谢您。我真的很感激。
根据你的标题,我的假设是你想将 2 条标准曲线组合在一个图上,并有一个反映每条曲线的图例。 ggplot()
根据传递给 aes()
函数的美学创建图例。要有颜色的图例,您首先需要使用分组变量(在下面的示例中设置)将数据组合到一个数据框中。
df1 <- tribble(
~NitriteConc, ~Absorbance,
100, 0.244288,
50, 0.125,
25, 0.0638,
12.5, 0.034,
6.25, 0.0166,
3.13, 0.0092,
1.56, 0.005967,
0, 0
)
df2 <- tribble(
~NitriteConc, ~Absorbance,
100, 0.25,
50, 0.16,
25, 0.07,
12.5, 0.03,
6.25, 0.02,
3.13, 0.009,
1.56, 0.006,
0, 0
)
df <- df1 %>%
mutate(set = factor(1)) %>%
rbind(df2 %>%
mutate(set = factor(2)))
然后在 aes()
中设置 color = set
将为 set
的每个级别映射一种新颜色。您可以为每个组设置标题、标签、颜色等。
ggplot(data = df,
aes(x = NitriteConc,
y = Absorbance)) +
geom_point(aes(color = set)) +
scale_y_continuous(breaks = c(0,0.05, 0.10, 0.15, 0.20, 0.25, 0.30)) +
scale_x_continuous(breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)) +
scale_color_manual(values = c("blue", "red"),
labels = c("STD 1", "STD 2")) +
geom_smooth(aes(color = set),
method = "lm",
formula = "y ~ x",
se = F) +
stat_regline_equation(aes(color = set),
show.legend = FALSE) +
stat_cor(aes(color = set),
label.y = c(0.30, 0.28),
show.legend = FALSE) +
guides(color = guide_legend(title = "Curve #")) +
labs(title = "Standard Curve") +
xlab("Nitrite Concentration (µM)") +
ylab("Absorbance")
给出:
编辑: 要将散点图放置为 1 个图表中的 2 个图表,您可以使用 facet_wrap()
,如下所示。
...
facet_wrap(~set) +
stat_regline_equation(aes(color = set),
show.legend = FALSE,
label.y = c(0.25, 0.25)) +
stat_cor(aes(color = set),
label.y = c(0.23, 0.23),
show.legend = FALSE) +
...
如果您希望两者都有自己的 y 轴,请将 scales = "free_y"
添加到 facet_wrap()
。
我一直在尝试添加和修改图例,但是在不同的网站、书籍等上花费了数小时后,我无法做到。
用于生成下图的数据 -> https://1drv.ms/u/s!Ao8fi7Xi8BskhKkDRQUn2zSdcgxofw?e=ki2eaA
library(tidyverse)
library(readr)
library(ggplot2)
library(ggpubr)
library(gridExtra)
library(cowplot)
ggplot(data = StandardCM1, aes_string(x = 'NitriteCon', y = "Absorbance")) +
geom_smooth(method="lm", se=FALSE, aes(color = "red"), formula = y ~ x) +
geom_point(shape = 21, size = 3, colour = "blue", fill = "blue")+
theme(legend.position = "right")+
scale_alpha_manual(name = NULL,
values = c("Standard Curve plot" = "white", "Circles" = "blue"),
breaks = c("Standard Curve Mean Values", "Regression Line"),
guide = guide_legend(override.aes = list(
shape = c(21, NA),
color = "blue") ) )+
scale_y_continuous(breaks = c(0,0.05, 0.10, 0.15, 0.20, 0.25, 0.30))+
scale_x_continuous(breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100))+
stat_cor(label.y = 0.30,
aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~")))+
stat_regline_equation(label.x=0, label.y=0.28)+
ggtitle("Standard Curve") +
xlab("Nitrite Concentration (µM)")+
ylab("Absorbance")
如你所见,具体到R后,它产生了一个奇怪的图例,并不能反映我想解释的东西。我知道在 geom_smooth(method="lm", se=FALSE, aes(color = "red"), formula = y ~ x)
部分 - 我可以将 aes(color = "red")
更改为 aes(alpha = "Fitted"
,但是它根本不会产生任何图例。
我在不同论坛和书籍中看到的示例反映了图表中显示的数据。因此,如果有点、线、三角形等,这些相同的形状就会显示在图例中。然而,在我的场景中(即使我可以产生某种图例),它并没有反映图中呈现的形状。
此外,由于我的数据的性质及其相似性,我想将两个散点图放在一个图中。不幸的是,当我尝试时,我完全没有成功。
这是使用相同数据的第二张图表。
library(tidyverse)
library(readr)
library(ggplot2)
library(ggpubr)
library(gridExtra)
library(cowplot)
ggplot(data = StandardCM1, aes_string(x = 'NitriteCon', y = "Absorbance1")) +
geom_smooth(method="lm", se=FALSE, aes(color = "red"), formula = y ~ x) +
geom_point(shape = 21, size = 3, colour = "blue", fill = "blue")+
scale_y_continuous(breaks = c(0,0.05, 0.10, 0.15, 0.20, 0.25, 0.30))+
scale_x_continuous(breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100))+
stat_cor(label.y = 0.30,
aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~")))+
stat_regline_equation(label.x=0, label.y=0.28)+
ggtitle("Standard Curve") +
xlab("Nitrite Concentration (µM)")+
ylab("Absorbance")
正如你所注意到的,即使我添加了
theme(legend.position = "right") +
scale_alpha_manual(
name = NULL,
values = c("Standard Curve plot" = "white", "Circles" = "blue"),
breaks = c("Standard Curve Mean Values", "Regression Line"),
guide = guide_legend(
override.aes = list(shape = c(21, NA),color = "blue"))
)
部分,R 决定不看它并生成与第一张图相同的图例。我不理解。我知道肯定有一些遗漏的代码,或者它们是错误的,但我找不到它们,因为 R 甚至没有告诉我哪里出了问题。它似乎只是忽略了 'pointless' 值之类的东西。
非常感谢您的宝贵时间和任何可能的帮助。
编辑
卡兹曼,非常感谢您的出色回答;这对我帮助很大。然而,在我的标题中说“将两个 scatter-plot 放到一张图上”,我的意思是 this。因此,我已经安装了 library(cowplot)
和 library(gridExtra)
,它们应该允许我在同一页上放置多个散点图(不仅如此)。
我知道 cowplot
和 gridExtra
是 ggplots2
的扩展,允许我们放置来自 ggplo2
函数的任何类型的乘法图。但在我的场景中,R 再次看不到我的输入。添加后
plot_grid(df1, df2, labels=c("A", "B"), ncol = 2, nrow = 1)
本节下:
ggplot(data = df,
aes(x = NitriteConc,
y = Absorbance)) +
它产生以下错误Here
再次感谢您。我真的很感激。
根据你的标题,我的假设是你想将 2 条标准曲线组合在一个图上,并有一个反映每条曲线的图例。 ggplot()
根据传递给 aes()
函数的美学创建图例。要有颜色的图例,您首先需要使用分组变量(在下面的示例中设置)将数据组合到一个数据框中。
df1 <- tribble(
~NitriteConc, ~Absorbance,
100, 0.244288,
50, 0.125,
25, 0.0638,
12.5, 0.034,
6.25, 0.0166,
3.13, 0.0092,
1.56, 0.005967,
0, 0
)
df2 <- tribble(
~NitriteConc, ~Absorbance,
100, 0.25,
50, 0.16,
25, 0.07,
12.5, 0.03,
6.25, 0.02,
3.13, 0.009,
1.56, 0.006,
0, 0
)
df <- df1 %>%
mutate(set = factor(1)) %>%
rbind(df2 %>%
mutate(set = factor(2)))
然后在 aes()
中设置 color = set
将为 set
的每个级别映射一种新颜色。您可以为每个组设置标题、标签、颜色等。
ggplot(data = df,
aes(x = NitriteConc,
y = Absorbance)) +
geom_point(aes(color = set)) +
scale_y_continuous(breaks = c(0,0.05, 0.10, 0.15, 0.20, 0.25, 0.30)) +
scale_x_continuous(breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)) +
scale_color_manual(values = c("blue", "red"),
labels = c("STD 1", "STD 2")) +
geom_smooth(aes(color = set),
method = "lm",
formula = "y ~ x",
se = F) +
stat_regline_equation(aes(color = set),
show.legend = FALSE) +
stat_cor(aes(color = set),
label.y = c(0.30, 0.28),
show.legend = FALSE) +
guides(color = guide_legend(title = "Curve #")) +
labs(title = "Standard Curve") +
xlab("Nitrite Concentration (µM)") +
ylab("Absorbance")
给出:
编辑: 要将散点图放置为 1 个图表中的 2 个图表,您可以使用 facet_wrap()
,如下所示。
...
facet_wrap(~set) +
stat_regline_equation(aes(color = set),
show.legend = FALSE,
label.y = c(0.25, 0.25)) +
stat_cor(aes(color = set),
label.y = c(0.23, 0.23),
show.legend = FALSE) +
...
如果您希望两者都有自己的 y 轴,请将 scales = "free_y"
添加到 facet_wrap()
。