如何按组和子组创建堆叠条形图 (ggplot)

时间:2021-01-09 16:41:09

标签: r ggplot2 group-by bar-chart stacked

我尝试使用 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 轴:百分比 1 和百分比 2 的值相互叠加

我最“成功”的解决方案:我简化了我的数据框,之后下面的代码给了我下面的条形图。但是,我没有设法创建子组。我使用了“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") 

Barplot

1 个答案:

答案 0 :(得分:0)

问题在于您将 gendergroup 混在一个变量中。使用 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)