我试图绘制一个geom\u条,其堆栈顺序取决于每个条中每组的累积值.因此,每个条应有不同的顺序.这是一个可复制的示例

set.seed(8)

#create dataframe
name <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z", "aa")
group <- c("1","1","1","2","2", "2", "1","1","1","1","1","1","1","1","1","1","1","1","2","2","2","2","2","2","2","2")
subgroup <- c("C", "C", "C", "C", "C", "C", "A", "A", "A","A","A","A","B","B","B","B","B","B","B","B", "C", "C", "C", "C", "C", "C")
value <- runif(26, min = 0, max = 10)

df <- data.frame(name, group, subgroup,value)

#plot
ggplot(data=df, aes(x=group, y=value)) + 
  geom_bar(stat="identity",aes(fill=reorder(subgroup, value)))

The latter results in the following plot: enter image description here

请注意,很明显,B子组在组1中表示的值高于C,但它绘制在C上方.我希望,对于每个组,子组都是根据其在组中的累积值排序的.有人知道如何做到这一点吗?提前感谢!

推荐答案

您可以通过预先计算计数并使用geom_tile而不是geom_bar来实现这一点.这种方式将自动处理任意数量的组和子组,无需手动干预.

library(dplyr); library(ggplot2)
df %>%
  count(group, subgroup, wt = value) %>%
  group_by(group) %>%
  arrange(group, -n) %>%
  mutate(middle = cumsum(n) - n/2) %>% 
  ungroup() %>%

  ggplot(aes(group, fill = subgroup)) +
  geom_tile(aes(y = middle, height = n), width = 0.9)

enter image description here

R相关问答推荐

创建重复删除的唯一数据集组合列表

以R为基数排列奇数个图

geom_Ribbon条件填充创建与数据不匹配的形状(ggplot 2 r)

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

向gggplot 2中的数据和轴标签添加大写和星号

如何在xyplot中 for each 面板打印R^2

打印XTS对象

Select 季度月值

如何从容器函数中提取conf并添加到ggplot2中?

Ggplot2中geom_tile的动态zoom

Data.table';S GForce-将多个函数应用于多列(带可选参数)

过滤名称以特定字符串开头的文件

根据列表中项目的名称合并数据框和列表

在列表中排列R数据框中的列顺序

正则表达式在第二个管道和第二个T之后拆分R中的列

避免在图例中显示VLINS组

注释不会绘制在所有ggplot2面上

如何将两个用不同的运算符替换*的矩阵相乘

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串

如何使用包含要子集的值的列表或数据框来子集多个列?