提问人:Sudoh 提问时间:9/10/2022 更新时间:9/10/2022 访问量:263
如何使用数据帧中的数据在 R 中制作堆积条形图?
How to make a stacked bar plot in R with the data from a dataframe?
问:
我有一个表格,如下所示:
家庭 | 麦克斯 | 意味 着 |
---|---|---|
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())
这在以下设计中给出了输出,这真的不是我想要的。
不确定链接帖子中的代码是否过时,或者我是否做错了什么。
我在这里看到一些随机网页(例如),那里显示这样的语法来制作条形图,但这里的对象需要是一个向量(我不确定我如何传递两组数据。barplot(Values, main = "total revenue", names.arg = months, xlab = "month", ylab = "revenue", col = colors)
values
在谷歌上搜索,似乎堆叠的条形图有点难以追踪。不幸的是,我不是最熟悉的,有人有什么指点吗?grammar of graphics
答:
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))
输出
另一种选择(而不是混合统计数据)是使用 ,这样你的意思是在一个图中,在另一个图中是最大值: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))
评论
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 轴相同。
评论