将图例添加到 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),它们应该允许我在同一页上放置多个散点图(不仅如此)。

我知道 cowplotgridExtraggplots2 的扩展,允许我们放置来自 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()