【问题标题】:How can I create a horizontal bar chart in R that is split in the middle based off an additional variable on the x-axis?如何在 R 中创建一个水平条形图,根据 x 轴上的附加变量在中间拆分?
【发布时间】:2021-06-05 04:17:19
【问题描述】:

我正在尝试创建一个水平条形图,以在白天和晚上以指定的深度间隔可视化丰度。基本上对于那些熟悉 diel 垂直迁移 (dvm) 的人来说,我试图将其可视化。

这里有一个link 来说明我正在谈论的内容,特别是图的底部。和another 一个。

到目前为止,我已经能够做到这一点

但我想让重复项并排显示,而不是用中间分隔线指示白天与黑夜的变化。因此,它不会在 y 轴上移动 5、4、3、2、1、5、4、3、2、1,而是在左侧有一组 5-1,在右侧有另一组,列直接并排。一侧有阴影,另一侧为白色也非常有用!我也想知道如何为标准差添加误差线。

这是我目前的代码:

abundance<-c(BroadClassification$Average[BroadClassification$BroadClassification=="Fish"])
fish<-c(BroadClassification$BroadClassification[BroadClassification$BroadClassification=="Fish"])
depth<-c(BroadClassification$ï..Net[BroadClassification$BroadClassification=="Fish"])
stdev<-c(BroadClassification$StdDev[BroadClassification$BroadClassification=="Fish"])
cols<- c(BroadClassification$DayNight[BroadClassification$BroadClassification=="Fish"])
bp1 <- barplot(abundance, main="Preliminary Broad Classification", horiz=TRUE, names.arg=depth)

这是一些示例数据

1  Net,DayNight,BroadClassification,Average,StdDev
2             1,Day,Cephalopod,0.5,0.08
3             1,Day,Crustacea,2,3.2
4                  1,Day,Fish,1,4.0
5            2,Day,Cephalopod,0.6,0.1
6             2,Day,Crustacea,6,2.3
7                  2,Day,Fish,7,8.1
8            3,Day,Cephalopod,0.2,0.2
9             3,Day,Crustacea,8,2.1
10                   3,Day,Fish,9,7.1
11           4,Day,Cephalopod,1,1.0
12            4,Day,Crustacea,0.3,0.2
13                 4,Day,Fish,4,7.8
14            5,Day,Cephalopod,5.2,6.1
15            5,Day,Crustacea,0.4,0.3
16                 5,Day,Fish,1.6,2.1
17         1,Night,Cephalopod,0.1,0.2
18          1,Night,Crustacea,1.8,4.2
19               1,Night,Fish,1.4,0.7
20          2,Night,Cephalopod,0.2,0.1
21          2,Night,Crustacea,3.2,8.9
22               2,Night,Fish,14,11.1
23         3,Night,Cephalopod,0.1,0.4
24           3,Night,Crustacea,1.2,2.4
25               3,Night,Fish,7.8,10.1
26         4,Night,Cephalopod,0.3,0.8
27          4,Night,Crustacea,4.2,4.1
28               4,Night,Fish,3.1,3.1
29         5,Night,Cephalopod,0.4,0.2
30          5,Night,Crustacea,0.9,0.1
31               5,Night,Fish,1.2,1.2

有人知道怎么做吗?任何帮助都会很棒!谢谢!

【问题讨论】:

标签: r data-visualization bar-chart


【解决方案1】:

我想这就是你要找的:-)

ggplot2dplyr 库对您很有用!您可以使用 dplyr::filter 提取所有 Fish 数据,而不是手动为每个变量提取。

然后,您可以使用ggplot 制作图表。我用正确的平均值绘制了 Day,用负的平均值绘制了 Night 数据。然后,翻转坐标(所以图形是垂直的)。然后,重新标记 y 轴,因为您不想显示负值。

library(ggplot2)
library(dplyr)

BroadClassificationFish <- BroadClassification %>% filter(BroadClassification == "Fish")

plot <- ggplot(BroadClassificationFish, aes(x = Net)) +
  geom_col(data = subset(BroadClassificationFish, DayNight == "Day"), 
           aes(y = Average, fill = 'Day')) +
  geom_col(data = subset(BroadClassificationFish, DayNight == "Night"), 
           aes(y = -Average, fill = 'Night')) + coord_flip() +
  scale_y_continuous(breaks = seq(-20,20, by = 4),
                     labels = (c(seq(20, 0, by = -4), seq(4,20,by=4))))
  
plot

要添加标准差条,您可以添加以下两个几何图形。

geom_errorbar(data = subset(BroadClassificationFish, DayNight == "Day"),
                #aes(ymin = Average - StdDev, ymax = Average + StdDev)) +
geom_col(data = subset(BroadClassificationFish, DayNight == "Night"), 
           aes(y = -Average, fill = 'Night')) + coord_flip()

数据的标准差相当大,所以看起来确实有点奇怪,很遗憾。

【讨论】:

  • 这太好了,谢谢!!我有最后一个问题,如何将 x 轴移动到图表的顶部而不是底部?再次感谢您!
  • + scale_x_discrete(position = "top")
  • 嗨!抱歉第二次跟进,我刚刚注意到一个问题。看起来它使用等效值作为白天和晚上的“平均值”。这些应该是不同的值。例如,白天的 Net 3 将比夜间的 Net 3 具有更高的平均值(在我制作的原始图表中可见)。你知道为什么它似乎使用等效值吗?代码看起来应该有差异,但看起来是等价的。另外,您知道如何添加误差线吗?它应该是 StdDev 列中的值。我试过使用 geom_errorbar 但它看起来位置不对。谢谢!
  • 我已经编辑了上面的答案!我在子集代码中出错了,所以使用 '==' 而不是 '=' 。否则,geom_errorbar 是正确的,它可能会由于这个特定的数据而看起来不正确。其他一些用户还将解决方案链接到使用 faceting 的类似问题,因此这可能是一个更优雅的解决方案。祝你好运:-)
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多