在一个图中使用 geom_point 和 geom_point 范围时如何保持因子顺序?

How to maintain factor orders when using geom_point and geom_pointrange in one plot?

编辑:添加了小 df。

我有一个名为 benthic_data 的小型数据集,其中包含一些底栖无脊椎动物指数(下面仅包含一个指标)。

Site <- c('S-7','S-7','S-7','S-7','S-7','S-27','S-27','S-27','S-27','S-27')
Sample <- c('S-7-1','S-7-2','S-7-3','S-7-4','S-7-5','S-27-1','S-27-2','S-27-3','S-27-4','S-27-5')
Abundance <- c(310, 316, 361,317, 321,108, 173, 189, 229, 210)

benthic_data <- data.frame(Site, Sample, Abundance)

我已将样本数据作为一个因素,并希望生成一个图形,其中每个样本有一个点,后跟每个站点的平均值(带有标准差晶须)。

benthic_data$Sample = factor(benthic_data$Sample, levels=c('S-7-1', 'S-7-2','S-7-3','S-7-4','S-7-5','S-27-1','S-27-2','S-27-3','S-27-4', 'S-27-5'))

站点的基本图及其各自的丰度值很好用(稍后我会把图画得更漂亮):

ggplot(benthic_data, aes(x=Sample, y=Abundance, fill=Site))+
    geom_point(data = benthic_data, size = 4.0, colour="black", shape=21, show.legend = F)+
  scale_fill_manual(values = c("darkgreen", "orangered3"))

为了计算每个站点的均值和标准差,我使用了以下代码来尝试分解每个站点,我还希望每个站点的 mean/sd 点标记为 S-7 均值和S-27 均值,分别。

benthic_summary<- as.data.frame(benthic_data) %>% 
  group_by(Site) %>% 
  summarize(mean=mean(Abundance, na.rm=T),
            sd=sd(Abundance, na.rm=T))

 benthic_summary$Site = revalue(benthic_summary$Site, c("S-7" = "S-7 Mean","S-27"="S-27 Mean"))
 benthic_summary$Site <- factor(benthic_summary$Site, levels= c("S-7 Mean","S-27 Mean"))

现在,为了将每个站点的 5 个点加上每个站点的 mean/sd,我使用 geom_pointrange 和以下代码,但我在 scale_fill_manual 中添加了两种颜色,因为我收到此错误消息:错误:手动比例中的值不足。需要 4 个,但只提供了 2 个。

所以,这段代码工作正常,除了,我需要先有 S-7 样本(它是上游站点),然后是 S-27 样本,并且图例没有反映正确的站点颜色。

站点 S-7 应为绿色,站点 S-27 应为橙色。

AEMP_cols=c("darkgreen", "orangered3")

ggplot(benthic_data, aes(x=Sample, y=Abundance, fill=Site))+
    geom_point(data = benthic_data, size = 4.0, colour="black", shape=21, show.legend = F)+
  scale_fill_manual(values = c("darkgreen","darkgreen", "orangered3", "orangered3"))+
    geom_pointrange(data = benthic_summary, aes(x = Site, y=mean, ymin=mean-sd, ymax=mean+sd), colour = AEMP_cols, size =1, shape = 15) 

所以,我想帮忙弄清楚如何确保样本(点)在x轴上的顺序是:S-7-1,S-7-2 .... S-7 -5、S7 平均值然后是 S-27-1、S-27-2 .... S-27-5、S-27 平均值。类似于上面创建的代码,但首先是 S-7 站点样本,然后是 S-27 样本。

我可以轻松地为其他指数重新创建代码,所以我现在只是从 Abundance 开始。

如有任何帮助,我们将不胜感激。 谢谢。

您在寻找这样的东西吗?

我首先生成第二个数据框,其中包含每个站点的计算平均值,我将其添加为原始数据集的附加行。我重新组织了因子样本和站点的级别。我最终使用 geom_pointgeom_errorbar:

将其传递到 ggplot
library(dplyr)
library(ggplot2)

Mean_DF <- benthic_data %>% 
  group_by(Site) %>% 
  summarise(Mean = mean(Abundance), SD = sd(Abundance)) %>%
  mutate(Sample = c("S-27-Mean","S-7-Mean")) %>% rename(Abundance = Mean)

benthic_data %>% select(Site, Sample, Abundance) %>% bind_rows(., Mean_DF) %>%
  mutate(Site = factor(Site, levels = c("S-7","S-27"))) %>%
  mutate(Sample = factor(Sample, levels=c('S-7-1', 'S-7-2','S-7-3','S-7-4','S-7-5','S-7-Mean','S-27-1','S-27-2','S-27-3','S-27-4', 'S-27-5','S-27-Mean'))) %>%
  ggplot(aes(x = Sample, y = Abundance, color = Site))+
  geom_point()+
  geom_errorbar(aes(ymin = Abundance-SD, ymax = Abundance+SD), width = 0.2)+
  scale_color_manual(values = c("darkgreen", "orangered3"))