如何绘制具有数据框的分组 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 Rbarplot

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】:

这是使用包含ggplot2tidyr 包的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 &lt;character&gt; and &lt;integer&gt;。你有什么建议吗?看来我的 AAA 值是字符,我的字母值是整数,我不能做长格式

以上是关于如何绘制具有数据框的分组 geom_bar 图?的主要内容,如果未能解决你的问题,请参考以下文章

geom_bar()函数绘制条形图

如何使用 geom_bar 并在 x 轴上使用两个分类变量

如何绘制具有多个变量的图?

绘制带有分面换行的条形图

如何绘制具有许多 MaN 的时间序列?

Pandas:如何绘制带有标签的数据框的条形图?