如何绘制具有数据框的分组 geom_bar 图?
Posted
技术标签:
【中文标题】如何绘制具有数据框的分组 geom_bar 图?【英文标题】:How to plot a grouped geom_bar plot having a dataframe? 【发布时间】:2021-11-12 14:09:27 【问题描述】:我有一个像这样的数据框:
并想在 R 中绘制如下内容:
但由于某种原因,我真的在为分组的 geom_bar 代码苦苦挣扎...... 你能帮帮我吗?
【问题讨论】:
【参考方案1】:我们可以使用来自base R
的barplot
barplot(t(df1), beside = TRUE, col = c("blue", "orange", "grey",
"yellow", "lightblue" ))
-输出
或者如果我们需要ggplot/plotly
library(ggplot2)
library(dplyr)
library(tidyr)
library(plotly)
library(tibble)
p <- df1 %>%
rownames_to_column('rn') %>%
pivot_longer(cols = -rn) %>%
ggplot(aes(x = rn, y = value, fill = name)) +
geom_col(position = 'dodge') +
theme_bw()
ggplotly(p)
-输出
数据
df1 <- structure(list(A = c(65, 9, 7, 70, 9), B = c(23, 4, 5, 53, 2),
C = c(42, 5, 2, 17, 7), D = c(51, 7, 5, 57, 5), E = c(14,
2, 2, 13, 4)), class = "data.frame", row.names = c("AAA",
"BBB", "CCC", "DDD", "EEE"))
【讨论】:
感谢您的帮助!真的很感激 另外,我知道在这种情况下它没有意义,但想象一下我想为“E 列”添加一个辅助轴。实施起来会不会很困难? @JoãoMachado 这并不难,但包的作者非常不鼓励【参考方案2】:这是使用包含ggplot2
和tidyr
包的tidyverse
包的解决方案。此外,此答案包括将数字绘制为条形顶部的文本。
library(tidyverse)
df1 %>%
# Convert rownames to a new column named rowname
rownames_to_column() %>%
# Put data into long format
pivot_longer(cols = -rowname,
names_to = "letter") %>%
# Build plot
ggplot(aes(x = rowname, y = value, fill = letter)) +
# Draw column plot and set position = "dodge" so every column
# starts from 0 value
geom_col(position = "dodge", width = 0.9) +
# Add text, sum 2 to value so the label is plotted on top of the column
geom_text(aes(y = value+2, label = value),
position = position_dodge(width = 0.9)) +
# Add bw theme or any other
theme_bw()
【讨论】:
感谢您的帮助!真的很感激添加数字是一个很好的接触 另外,我知道在这种情况下它没有意义,但想象一下我想为“E 列”添加一个辅助轴。实施起来会不会很困难? 不,使用scale_y_continuous(...,sec.axis)
很容易做到这一点。
嗨@Jonathan,很抱歉再次打扰您,但是在使用此代码时,我收到此错误Error: Can't combine <character> and <integer>
。你有什么建议吗?看来我的 AAA 值是字符,我的字母值是整数,我不能做长格式以上是关于如何绘制具有数据框的分组 geom_bar 图?的主要内容,如果未能解决你的问题,请参考以下文章