【问题标题】:Multiple side-by-side barplots grouped by one numerical variable由一个数值变量分组的多个并排条形图
【发布时间】:2016-12-18 17:04:48
【问题描述】:

对于提出一个简单的问题,我深表歉意,但过去几天我一直在努力寻找解决方案。下面数据框中的 Sampling.Station.Number 下有 8 个级别。因此,我试图制作一个并排的条形图,显示每个采样站的三个条形图,用于检测到的三种蝙蝠物种,称为:(1)Pipestrellus pygmaeus; (2) 烟斗; (3)夜蛾。

有什么建议吗?我进行了一些搜索,但我只找到了 x 轴上的因子示例,而不是按数值变量分组的变量,任何帮助将不胜感激!

最后我想生成一个与我构建的箱线图格式相同的条形图:

我用下面的代码创建了这些箱线图:

         Sampling.Station.labels=c("1","2","3","4","5","6","7","8")

         bat.labels<-c("Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula",
                       "Pipistrellus pygmaeus", "Pipestrellus pipestrellus", "Nyctalus noctula")


         data_long <- gather(bats1, x, Mean.Value, Saparano.Pipestrelle:Noctule)
         head(data_long) 

         stacked.data.1<-melt(data_long, id=c('Sampling.Station', 'x'))
         head(stacked.data.1)
         str(stacked.data.1)


         stacked.data.1=stacked.data.1[, -3]
         head(stacked.data.1)
         colnames(stacked.data.1)<-c("Sampling.Station", "Bat.Species", "Light.Intensity") 
         head(stacked.data.1)


         par(mfrow = c(1,1))
         boxplots.double.1=boxplot(Lighty.Intensity~Sampling.Station + Bat.Species, 
                                   data = stacked.data.1, 
                                   at = c(1:24), 
                                   ylim = c(min(0, min(0)), 
                                            max(30, na.rm = T)),
                                   xaxt = "n",
                                   notch=TRUE,
                                   col = c("red", "blue", "green"),
                                   cex.axis=0.7,
                                   cex.labels=0.7,
                                   ylab="Light Intensity (Lux)", 
                                   xlab="Sampling Stations",
                                   space=1)

         axis(side = 1, at = seq(3, 24, by = 1), labels = FALSE)
         text(seq(3, 24, by=3), par("usr")[3] - 0.2, labels=unique(Sampling.Station.labels), srt = 45, pos = 1, xpd = TRUE, cex=0.8)
         par(oma = c(4, 1, 1, 1))
         par(fig = c(0, 1, 0, 1), oma = c(0, 0, 0, 0), mar = c(0, 0, 0, 0), new = TRUE)
         plot(0, 0, type = "n", bty = "n", xaxt = "n", yaxt = "n")
         legend("top", 
                legend=c("Pipistrellus pygmaeus","Pipestrellus pipestrellus","Nyctalus noctula"),
                fill=c("Blue", "Red", "Green"),
                xpd = TRUE, horiz = TRUE, 
                inset = c(0,0), 
                bty = "n", 
                col = 1:4, 
                cex = 0.8,
                title = "Bat Species",
                lty = c(1,1))

我尝试了 Richard 的建议,但我仍然遇到此错误消息,谁能提供帮助。非常感谢,如果可能的话:

   data=format

   Data structure: 

   'data.frame':    144 obs. of  5 variables:
     $ Sampling.Station    : num  1 1 1 2 2 2 3 3 3 4 ...
     $ Light.Intensity.S   : num  26.9 25.2 39 29.8 21.8 ...
     $ Number.of.bat.passes: num  3 2 5 6 15 2 10 12 17 2 ...
     $ Bat.Species         : Factor w/ 3 levels       "Common.Pipestrelle",..: 3 3 3 3 3 3 3 3 3 3 ...
     $ Simpsons.Index      : num  0.4444 0 0 0.0278 0 ...

       df %>% 
       gather(key = bat.species, value = value, -station) %>%
       mutate(station = as.factor(station)) %>%
       ggplot(aes(x = station, y = value, colour = variable)) +
       geom_boxplot() + 
       facet_grid(~bat.species, scales = "free_y")


       **Error in eval(expr, envir, enclos) : object 'Sampling.Station' not found**

数据框

bats1<-structure(list(Sampling.Station = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 
4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 2, 2, 2, 3, 3, 3, 
4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 1, 1, 1, 1, 1, 1, 
2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 
2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 
1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 
7, 7, 7, 8, 8, 8, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 
7, 7, 7, 8, 8, 8, 1, 1, 1), Light.Intensity = c(26.9, 25.16, 
39, 29.81, 21.83, 20.22, 2.9, 2.1, 0.85, 0.62, 0.39, 0.26, 24.7, 
21.99, 20.46, 26.32, 0, 0, 0.43, 0.02, 0.02, 0.03, 0.02, 0.03, 
 293.56, 167.79, 114.06, 17.22, 16.26, 4.76, 0.63, 0.56, 0.56, 
 86.63, 87.97, 88.59, 0.31, 0.04, 0.05, 0, 0.01, 0.01, 0.02, 2.6, 
 2.68, 2.62, 0.43, 0.44, 26.9, 25.16, 39, 29.81, 21.83, 20.22, 
 2.9, 2.1, 0.85, 0.62, 0.39, 0.26, 24.7, 21.99, 20.46, 26.32, 
 0, 0, 0.43, 0.02, 0.02, 0.03, 0.02, 0.03, 293.56, 167.79, 114.06, 
 17.22, 16.26, 4.76, 0.63, 0.56, 0.56, 86.63, 87.97, 88.59, 0.31, 
 0.04, 0.05, 0, 0.01, 0.01, 0.02, 2.6, 2.68, 2.62, 0.43, 0.44, 
 26.9, 25.16, 39, 29.81, 21.83, 20.22, 2.9, 2.1, 0.85, 0.62, 0.39, 
  0.26, 24.7, 21.99, 20.46, 26.32, 0, 0, 0.43, 0.02, 0.02, 0.03, 
  0.02, 0.03, 293.56, 167.79, 114.06, 17.22, 16.26, 4.76, 0.63, 
  0.56, 0.56, 86.63, 87.97, 88.59, 0.31, 0.04, 0.05, 0, 0.01, 0.01, 
  0.02, 2.6, 2.68, 2.62, 0.43, 0.44), Number.of.bat.passes = c(3, 
  2, 5, 6, 15, 2, 10, 12, 17, 2, 0, 0, 15, 7, 17, 0, 1, 0, 14, 
  10, 12, 7, 4, 1, 3, 5, 3, 1, 6, 11, 3, 0, 0, 12, 11, 9, 1, 2, 
  1, 12, 14, 10, 3, 2, 1, 5, 4, 2, 3, 2, 5, 6, 15, 2, 10, 12, 17, 
  2, 0, 0, 15, 7, 17, 0, 1, 0, 14, 10, 12, 7, 4, 1, 3, 5, 3, 1, 
  6, 11, 3, 0, 0, 12, 11, 9, 1, 2, 1, 12, 14, 10, 3, 2, 1, 5, 4, 
  2, 3, 2, 5, 6, 15, 2, 10, 12, 17, 2, 0, 0, 15, 7, 17, 0, 1, 0, 
  14, 10, 12, 7, 4, 1, 3, 5, 3, 1, 6, 11, 3, 0, 0, 12, 11, 9, 1, 
  2, 1, 12, 14, 10, 3, 2, 1, 5, 4, 2), Bat.Species = structure(c(3L, 
  3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
  3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
  3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 
  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
  2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
  2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
  2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label =           c("Common.Pipestrelle", 
 "Noctule", "Saprano.Pipestrelle"), class = "factor"), Simpsons.Index =           c(0.444444444, 
  0, 0, 0.027777778, 0, 0, 0.25, 0, 0.08650519, 0, 0, 0, 0.111111111, 
  0, 0.124567474, 0, 0, 0, 0.25, 0.01, 0.111111111, 0.081632653, 
  0, 0, 0, 0.04, 0, 1, 0.027777778, 0.033057851, 0.111111111, 0, 
  0, 0.027777778, 0.074380165, 0.012345679, 0, 0, 1, 0.173611111, 
  0.081632653, 0.16, 1, 0.25, 0, 0.04, 0.25, 0.25, 0.25, 0, 0, 
  7, 0, 0, 0, 0, 0.08, 0, 0, 0, 0.6, 0, 0.222222222, 0, 0, 0, 0.142857143, 
  9, 0.5, 1.25, 0, 0, 0, 4, 0, 0, 5, 2, 1, 0, 0, 1.25, 0.888888889, 
  5, 0, 0, 2, 0.28, 0.625, 0.375, 0, 1, 0, 4, 0.5, 1, 0, 0, 1, 
  0, 0.109375, 0, 0, 0, 0.75, 0, 0, 0, 0, 0.08, 0.046875, 0, 0, 
  0, 0, 0, 0.046875, 0, 0, 0, 0, 0.0625, 0, 0, 0, 0.015625, 0, 
  0, 0, 0.28, 0, 0.12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names =    c(NA, 
  -144L), .Names = c("Sampling.Station", "Light.Intensity",         "Number.of.bat.passes", 
   "Bat.Species", "Simpsons.Index"), class = "data.frame")

【问题讨论】:

  • 您想要 y 轴上的光谱仪值?您想对 D.SP、D.CP 和 D.N 列上的​​值做什么?你不是说你想要y轴上的那些吗?我很困惑。
  • 图像显示的是箱线图,而不是条形图。你想要什么?
  • 使用 tidyr::gather 重塑您的数据框,然后在变量名上使用 facet_wrap。
  • 嗨,是的,光谱仪是在城市公园内的八个不同点标记处进行的一系列光强度测量,在靠近街道照明的黑暗/光照条件下,通过这三个的计数来测量存在或不存在不同光照强度下的物种 D.SP、D.CP 和 DN。
  • 因此,我希望 x 轴显示八个不同的采样站,这三个物种的计数将按采样站分组。因此,每个采样站三个条形显示这三个物种 D.SP、D.CP 和 D.N 在不同光强度测量下的计数,应该在 y 轴上。上面是一个条形图的例子,我试图模仿它。我已经使用了 tidyr:gather 并且我不断地获得错误测量值,并且所有物种的条形似乎都是相同的大小。我只是无法解决这个问题。

标签: r ggplot2 bar-chart


【解决方案1】:

我不太确定你在追求什么。这就是我对这些数据所做的事情。我使用的是箱线图而不是条形图,因为我认为后者对于显示变化通常相当无用。

library("dplyr")
library("tidyr")
library("ggplot2")

df %>% 
  gather(key = variable, value = value, -Sampling.Station.Number) %>%
  mutate(Sampling.Station.Number = as.factor(Sampling.Station.Number)) %>%
  ggplot(aes(x = Sampling.Station.Number, y = value, colour = variable)) +
  geom_boxplot() + 
  facet_wrap(~variable, scales = "free_y")

数据

df <- structure(list(Sampling.Station.Number = c(1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 
8L, 8L, 8L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 
6L, 6L, 7L, 7L, 7L, 8L, 8L, 8L, 1L, 1L, 1L), Spectrometer = c(26.9, 
25.16, 39, 29.81, 21.83, 20.22, 2.9, 2.1, 0.85, 0.62, 0.39, 0.26, 
24.7, 21.99, 20.46, 26.32, 0, 0, 0.43, 0.02, 0.02, 0.03, 0.02, 
0.03, 293.56, 167.79, 114.06, 17.22, 16.26, 4.76, 0.63, 0.56, 
0.56, 86.63, 87.97, 88.59, 0.31, 0.04, 0.05, 0, 0.01, 0.01, 0.02, 
2.6, 2.68, 2.62, 0.43, 0.44), D.SP = c(0.667, 0, 0, 0.167, 0, 
0, 0.5, 0, 0.294, 0, 0, 0, 0.333, 0, 0.353, 0, 0, 0, 0.5, 0.1, 
0.333, 0.286, 0, 0, 0, 0.2, 0, 1, 0.167, 0.182, 0.333, 0, 0, 
0.167, 0.273, 0.111, 0, 0, 1, 0.417, 0.286, 0.4, 1, 0.5, 0, 0.2, 
0.5, 0.5), D.CP = c(0.333, 1, 0.4, 1.167, 0.533, 1, 0, 0.167, 
0.118, 0, 0, 0, 1, 0.714, 0.471, 0, 1, 0, 0.5, 0.9, 0.667, 0.714, 
1, 1, 1, 0.8, 1, 0, 0.833, 0.727, 0.333, 0, 0, 0.417, 0.727, 
0.556, 1, 1, 2, 0.583, 0.714, 0.6, 0, 0.5, 1, 0.8, 0.5, 0.5), 
    D.N = c(0, 0, 0.8, 0, 0.467, 0, 0, 0, 0.176, 1, 0, 0, 0, 
    0.286, 0.176, 0, 0, 0, 0, 0, 0.25, 0, 0, 0, 0, 0.2, 0, 0, 
    0, 0.091, 0, 0, 0, 0.583, 0, 0.333, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0)), .Names = c("Sampling.Station.Number", "Spectrometer", 
"D.SP", "D.CP", "D.N"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", 
"47", "48"))

【讨论】:

  • 嗨,理查德,非常感谢您回复我,非常感谢您的建议。我尝试使用您的代码并收到此错误消息 错误:不是兼容STRSXP。我将 x 的阶乘列名称更改为 bat.species,然后将 bat.species 替换为代码中的变量。但是,我仍然看不到我做错了什么。我为名为格式的数据集输入了我的数据结构(如上所示)。任何建议都会被热情接受。再次感谢您
  • 在你上面的新代码中,你可能想要 facet_grid 而不是 facet_wrap
  • gather(key = bat.species, value = value, - format$Sampling.Station.Number) 可能不起作用,因为 format$Sampling.Station.Number 不是 df 中的列
  • 嘿,Richard,我使用了 facet_grid 并进行了必要的更改。我仍然无法让代码工作。是否有可能请指出我做错了什么,我是 ggplot 的新手并且还在学习,所以这个练习很棒!我在上面放置了带有错误消息的新代码。谢谢
  • 您显示的数据和您描述的数据似乎不一样。 station 不是 df 中的列。它是 Sampling.Station.Number。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2013-02-15
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多