r - 如何按组的最大平均比例对 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())
解决方案
我不确定这是否一定更好,但这是在您的问题中产生相同图表的一种方法:
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()
推荐阅读
- android - 具有相同包名称的不同构建类型的 Android 应用程序
- laravel - 控制 webpack 编译进度输出 - Laravel Mix/Envoy
- javascript - 使用 craco 的 React-hot-loader
- c# - 具有多个连接操作的实体框架中的左连接
- php - 使用预先填充的表单更新数据库中的记录
- multiple-columns - GREL 中是否有一个函数可以根据 OpenRefine 中的标题一次删除许多列?
- c++ - 带有模板参数 enable_if 的 C++ 友元函数
- typescript - Firebase 使用 typescript 在函数构建器和句柄构建器中部署错误
- apple-watch - iOS WatchOS6“复杂服务器连接无效。”
- mysql - json 到 sql 查询转换器