首页 > 解决方案 > 如何按组和子组创建堆叠条形图(ggplot)

问题描述

我没有成功尝试使用以下数据框使用 ggplot 创建条形图:

test  <- data.frame(group=c("A", "A", "B", "B"), 
                    gender=c(0,1,0,1),     
                    percent1=c(2,3,4,3), 
                    percent2=c(1,2,0.5,1))

我想做的是创建一个条形图。X 轴:按字母('A'、'B')分组,并按性别(0 或 1)拆分这些组。Y 轴:percent1 和 percent2 的值相互叠加

我最“成功”的解决方案:我简化了我的数据框,之后下面的代码给了我下面的条形图。但是,我没有设法创建子组。我使用了“facet_wrap”和“facet_grid”,但因此未能从这些中创建一个图。

问题:如何制作按组和子组排列的堆叠条形图?

# require(ggplot)
# require(reshape)

dfr <- data.frame(percent1 = c(2,3,4,3,1,5),
                    percent2 = c(1,2,0.5,1,1,1),
                    row.names = c("A female", "A male", "B female", "B male", "C female", "C male"))

dfr$category <- row.names(dfr)
mdfr<-melt(dfr, id.vars="category")

plot <- ggplot(mdfr, aes(category, value, fill=variable)) + 
  geom_bar(stat = "identity") 

条形图

标签: rggplot2group-bybar-chartstacked

解决方案


问题是您混淆了gender一个group变量。利用tidyr::pivot_longer重塑您的数据集,您可以实现如下结果:

test  <- data.frame(group=c("A", "A", "B", "B"), 
                    gender=c(0,1,0,1),     
                    percent1=c(2,3,4,3), 
                    percent2=c(1,2,0.5,1))

library(ggplot2)
library(dplyr)
library(tidyr)

test %>% 
  mutate(gender = recode(gender, "0" = "male", "1" = "female")) %>% 
  pivot_longer(starts_with("percent")) %>% 
  ggplot(aes(gender, value, fill = name)) +
  geom_col() +
  facet_wrap(~group)


推荐阅读