我正在使用ggplot创建一个堆叠条形图,如下所示:

plot_df <- df[!is.na(df$levels), ] 
ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")

这给了我类似的东西:

enter image description here

我如何颠倒堆叠钢筋的顺序,使1层位于底部,5层位于每个钢筋的顶部?

我已经看到了很多关于这方面的问题(例如How to control ordering of stacked bar chart using identity on ggplot2),常见的解决方案似乎是按照这个级别对数据帧重新排序,因为ggplot使用的是确定顺序

所以我try 使用dplyr重新排序:

plot_df <- df[!is.na(df$levels), ] %>% arrange(desc(levels))

然而,故事情节是一样的.我是按升序排列还是按降序排列似乎也没什么区别

以下是一个可复制的示例:

group <- c(1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4)
levels <- c("1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4","5","5","5","5","1","1","1","1")
plot_df <- data.frame(group, levels)

ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")

推荐答案

The release notes of ggplot2 version 2.2.0 on Stacking bars suggest:

如果你想按相反的顺序堆叠,试试forcats::fct_rev()

library(ggplot2)   # version 2.2.1 used    
plot_df <- data.frame(group = rep(1:4, 6),
                      levels = factor(c(rep(1:5, each = 4), rep(1, 4))))
ggplot(plot_df, aes(group, fill = forcats::fct_rev(levels))) + 
  geom_bar(position = "fill")

Reverse levels

这是original plot:

ggplot(plot_df, aes(group, fill = levels)) + 
  geom_bar(position = "fill")

Original plot

或者,按照alistaire in his comment的建议使用position_fill(reverse = TRUE):

ggplot(plot_df, aes(group, fill = levels)) + 
  geom_bar(position = position_fill(reverse = TRUE))

enter image description here

请注意,图例中的标高( colored颜色 )的顺序与堆叠条形图中的顺序不同.

R相关问答推荐

修改dDeliverr中列表列的最后一个元素

feature_weights参数没有影响Xgboost

R图中的字体大小和字体样式(带有R底图)

通过Plotly绘制线串几何形状的3D图

卸载安装了BRM的模型发出的警告

如何从其他前面列中减go 特定列的平均值?

如何在R中正确对齐放射状图中的文本

如何根据条件计算时差(天)

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

从开始时间和结束时间导出时间

删除具有相同标题的tabPanel(shinly)

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

如何在科学记数法中显示因子

更新R中的数据表(使用data.table)

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

在R中使用列表(作为tibble列)进行向量化?

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

分隔日期格式为2020年7月1日