首页 > 解决方案 > 如何按组的最大平均比例对 geom_col 排序,然后绘制堆积条形图

问题描述

我有数据,我想按一组的最高平均值排序,然后将它们绘制为堆积条形图。我已经设法通过生成几个数据帧来做到这一点,但它很冗长,我想知道是否有一种不那么冗长的方式来做到这一点?

set.seed(3)
   x <- rep(letters[1:5], 3)
fill <- rep(letters[24:26], 5)
   n <- runif(15, 0, 1)
  df <- data.frame(x, fill, n)

df2 <- df %>%
  group_by(x) %>%
  mutate(percent = n/sum(n))

df3 <- df2 %>%
  group_by(fill) %>%
  summarise(mean = mean(percent))  %>%
  ungroup() %>%
  arrange(desc(mean))

df3 <- df2[df2$fill == df3$fill[1], ] %>%
  arrange(desc(percent))
df$x <- factor(df$x, levels = df3$x)    

ggplot(data = df, aes(x, y, fill = fill)) +
  geom_col(position = position_fill()) 

在此处输入图像描述

标签: rggplot2dplyr

解决方案


我不确定这是否一定更好,但这是在您的问题中产生相同图表的一种方法:

df %>%
  group_by(x) %>%
  mutate(pct = n / sum(n)) %>%
  ungroup() %>%
  arrange(fill != "z", desc(pct)) %>%
  group_by(fill) %>%
  mutate(order = row_number()) %>%
  ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
  geom_col()

根据您实际尝试比较的内容,您可能需要考虑不同的排序或方面。例如,考虑当您选择分面与堆叠时会发生什么:

df %>% 
  group_by(x) %>%
  mutate(pct = n / sum(n)) %>%
  ggplot(aes(x, pct, fill = fill)) +
  geom_col() +
  facet_wrap(~ fill)

在此处输入图像描述

2019 年 2 月 18 日更新(根据评论)更新以z提前了解抽象。mean(pct)为每个排序,fill后跟pct

df %>%
  group_by(x) %>%
  mutate(pct = n / sum(n)) %>%
  group_by(fill) %>%
  mutate(mean_pct = mean(pct)) %>%
  arrange(desc(mean_pct), desc(pct)) %>%
  mutate(order = row_number()) %>%
  ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
  geom_col()

推荐阅读