如何使用数据帧中的数据在 R 中制作堆积条形图?

How to make a stacked bar plot in R with the data from a dataframe?

提问人:Sudoh 提问时间:9/10/2022 更新时间:9/10/2022 访问量:263

问:

我有一个表格,如下所示:

家庭 麦克斯 意味 着
OG0000000 1336 348.23423423423424
OG0000001 152 66.31531531531532
OG0000002 104 33.85585585585586
OG0000003 133 32.990990990990994
OG0000004 118 31.135135135135137
OG0000005 79 30.83783783783784
OG0000006 123 30.153153153153152
OG0000007 131 29.81081081081081
OG0000008 129 29.684684684684683
OG0000009 93 29.405405405405407
OG0000011 169 28.35135135135135
OG0000012 73 27.56756756756757
OG0000013 113 27.504504504504503
OG0000014 87 24.72972972972973
OG0000015 106 24.675675675675677
OG0000017 131 23.306306306306308
OG0000018 80 22.81081081081081
OG0000020 234 21.324324324324323
OG0000024 89 20.89189189189189

我想制作一个条形图,其中每个条形将第一列('family')中的数据作为标签,并将数据堆叠在每个柱形的第二列和第三列中。假设第二列的数据点构成条形图中显示的主要数据,而第三列的数据覆盖在其上。

我正在尝试在 ggplot 中执行此操作。

我尝试了以下方法(摘自这篇文章):

df_long <- df2 %>% gather(family,counts, 2:3) # here df is the above table as a dataframe
ggplot(df_long, aes(x = family, y = counts, fill = family)) + geom_col(position = position_stack())

这在以下设计中给出了输出,这真的不是我想要的。

The image that this code produced

不确定链接帖子中的代码是否过时,或者我是否做错了什么。

我在这里看到一些随机网页(例如),那里显示这样的语法来制作条形图,但这里的对象需要是一个向量(我不确定我如何传递两组数据。barplot(Values, main = "total revenue", names.arg = months, xlab = "month", ylab = "revenue", col = colors)values

在谷歌上搜索,似乎堆叠的条形图有点难以追踪。不幸的是,我不是最熟悉的,有人有什么指点吗?grammar of graphics

r ggplot2

评论


答:

1赞 AndrewGB 9/10/2022 #1

如果你想将每个家庭的最大值和平均值堆叠在一起,那么你可以做这样的事情:

library(tidyverse)

df2 %>%
  pivot_longer(-family) %>%
  ggplot(aes(x = family, y = value, fill = name)) +
  geom_col(position = position_stack()) +
  theme(axis.text.x = element_text(angle = 90))

输出

enter image description here

另一种选择(而不是混合统计数据)是使用 ,这样你的意思是在一个图中,在另一个图中是最大值:facet_wrap

df2 %>%
  pivot_longer(-family) %>%
  ggplot(aes(x = family, y = value)) +
  geom_col(position = position_stack()) +
  scale_y_continuous(breaks = seq(0, 1400, 200),
                     limits = c(0, 1400)) +
  facet_wrap( ~ name, scales = "free_y") +
  theme(axis.text.x = element_text(angle = 90))

enter image description here

评论

0赞 Sudoh 9/10/2022
这看起来很酷!但我认为,如果每个条形都有自己的条形图,并且在每个条形图中显示平均值和最大数据点,那么传达数据会更容易,因此每行一个柱线,反之亦然。这可能吗?family
0赞 AndrewGB 9/10/2022
@RijanDhakal 我刚刚添加了另一个选项。老实说,如果你想展示家庭之间的比较,那么我不会把它们堆叠起来。我只想分别显示平均值和最大值的比较。这样效果更好吗?或者你在想一些不同的东西?
0赞 Sudoh 9/10/2022
刻面也很好。有什么方法可以强制跨分面进行类似的垂直缩放吗?我认为在两个图表中具有相同的垂直比例可能会使比较在视觉上更容易一些(在上图中,300 和 1000 看起来有些相似),但除此之外,刻面也很棒。
0赞 AndrewGB 9/10/2022
@RijanDhakal,我更新了我的答案,将最大值和平均值按族堆叠在一起(现在在顶部),并且我用刻面更新了第二个图形,以便每个图形的 y 轴相同。