如何使用 ggplot 在一帧中为物种丰富度和多样性制作条形图

How to make a barplot with ggplot for species richness and diversity in one frame

我还是 R 的新手,我有一些关于使用 ggplot 的问题和帮助。

我一直在使用 spadeR 在每个采样位置获取物种丰富度和多样性,我想为我的数据可视化制作条形图。但是我在获取 ggplot 的正确代码时遇到了一些麻烦。

这是我想要的数据可视化的示例。

但我的条形图看起来像这样

我想在框架的顶部添加图例,我尝试添加它,但结果很糟糕。

谁能告诉我如何使用 ggplot 解决这个问题,以及如何像上面的示例那样在一帧中制作 2 个条形图,如何使用 parfrow?希望有人能教我如何解决这个问题。非常感谢!

这里是我在 10 个采样点的物种丰富度数据集,包括物种丰富度的估计分数和标准误差。

datalw <- as.matrix(data.frame(Bng = c(8, 0.4),
                               Krs= c(3, 0),
                               Bny= c(3, 0),
                               Kmb= c(9.1, 7.40),
                               Sgk= c(3, 0.3),
                               Lwb= c(6.4, 1.0),
                               Lws= c(4.3, 0.7),
                               Krm= c(3, 0.5),
                               Hrt= c(7, 0.5),
                               Gmb= c(6.5, 1.0)))
rownames(datalw) <- c("Estimates", "s.e")
datalw                                                  

barplot(datalw,                                         
        col = c("#1b98e0", "#353436"))
legend("top",                                    
       legend = c("estimates", "s.e"),
       fill = c("#1b98e0", "#353436"))

我不得不稍微研究一下你的数据。您不必将 datalw 设为矩阵,因为它最终会导致问题。您的数据也有多列而不是多行,因此我为您重新设置了数据格式。

datalw <- structure(list(loc = structure(c(1L, 7L, 2L, 5L, 10L, 8L, 9L, 
6L, 4L, 3L), .Label = c("Bng", "Bny", "Gmb", "Hrt", "Kmb", "Krm", 
"Krs", "Lwb", "Lws", "Sgk"), class = "factor"), V1 = c(8, 3, 
3, 9.1, 3, 6.4, 4.3, 3, 7, 6.5), V2 = c(0.4, 0, 0, 7.4, 0.3, 
1, 0.7, 0.5, 0.5, 1)), class = "data.frame", row.names = c(NA, 
-10L))

由于您想并排放置条形图,因此可以将这些数据融合在一起以更轻松地绘制数据

library(ggplot2)
library(ggpattern)
library(reshape2)

datalw2 <- melt(datalw, id.vars='loc')

有一种方法可以用 ggplot 制作图案,你可以使用 ggpattern

ggplot(datalw2,aes(x=loc, y=value, fill=variable, group=variable, pattern = variable)) +
  geom_bar_pattern(stat='identity', position='dodge') +
  scale_pattern_manual(values = c(V1 = "stripe", V2 = "crosshatch"))

这将产生这样的情节。有更高级的方法可以更改图片中的图案,但是,您必须自己创建图案,而不是使用 ggpattern

中的默认图案

您的数据没有足够的信息来创建图片中显示的误差线

你也可以像这样把情节黑白化

ggplot(datalw2,aes(x=loc, y=value, fill=variable, group=variable, pattern = variable)) +
  geom_bar_pattern(stat='identity', position='dodge') +
  theme_bw() + 
  scale_pattern_manual(values = c(V1 = "stripe", V2 = "crosshatch")) +
  scale_fill_grey(start = .9, end = 0)

有一种方法可以像您的图片一样创建并排图,但是您也没有足够的数据来制作第二个图

如果您想将误差线添加到图表中。您可以使用 geom_errorbar。使用您在下方评论中提供的数据

datadv <- structure(list(caves = structure(c(1L, 7L, 2L, 5L, 10L, 8L, 9L,  6L, 4L, 3L),  .Label = c("Bng", "Bny", "Gmb", "Hrt", "Kmb", "Krm", "Krs", "Lwb", "Lws", "Sgk"), class = "factor"), Index = c(1.748, 0.022, 1.066, 1.213, 0.894, 0.863, 1.411, 0.179, 1.611, 1.045),  Std = c(0.078, 0.05, 0.053, 0.062, 0.120, 0.109, 0.143, 0.072, 0.152, 0.171)),  class = "data.frame", row.names = c(NA,-10L))

library(ggpattern)
library(ggplot2)
ggplot(datadv,aes(x=caves, y=Index)) +
  geom_bar_pattern(stat='identity', position='dodge') +
  theme_bw() + 
  scale_pattern_manual(values = c(V1 = "stripe", V2 = "crosshatch")) +
  scale_fill_grey(start = .9, end = 0) +
  geom_errorbar(aes(ymin=Index-Std, ymax=Index+Std), width=.2,
                position=position_dodge(.9))