ggplot 根据数据框中的值重新排序堆叠条形图

ggplot reorder stacked bar plot based on values in data frame

我正在使用 R 中的 ggplot2 制作堆叠条形图,并在 y 轴上使用特定的条形排序。

# create reproducible data
library(ggplot2)
d <- read.csv(text='Day,Location,Length,Amount
            1,4,3,1.1
            1,3,1,2
            1,2,3,4
            1,1,3,5
            2,0,0,0
            3,3,3,1.8
            3,2,1,3.54
            3,1,3,1.1',header=T)

ggplot(d, aes(x = Day, y = Length)) + geom_bar(aes(fill = Amount, order = Location), stat = "identity")

ggplot(d, aes(x = Day, y = Length)) + geom_bar(aes(fill = Amount, order = rev(Location)), stat = "identity")

第一个 ggplot 图按位置顺序显示数据,位置 = 1 最接近 x 轴,位置的每个递增值的数据堆叠在下一个上。

第二个 ggplot 图以不同的顺序显示数据,但它不会将距离 x 轴最近的最高位置值的数据与第二个从 x 轴堆叠的下一个最高位置的数据堆叠在一起- 第一个条柱的轴位置,就像我期望的那样基于

下一个片段确实以所需的方式显示了数据,但我认为这是简单的小型示例数据集的产物。未指定堆叠顺序,所以我认为 ggplot 是根据 Amount 的值堆叠的。

ggplot(d, aes(x = Day, y = Length)) + geom_bar(aes(fill = Amount), stat = "identity")

我想要的 是强制 ggplot 按 Location 值递减的顺序堆叠数据(离 x 轴最近的 Location=4,下一个 Location=3,... , 并且 Location=1 在栏列的最顶部)通过调用 order = 或一些等效参数。有什么想法或建议吗?

看起来应该很容易,因为我只处理数字。要求 ggplot 以对应于一列递减(当您远离 x 轴)数字的方式堆叠数据应该不难吧?

尝试:

ggplot(d, aes(x = Day, y = Length)) + 
  geom_bar(aes(fill = Amount, order = -Location), stat = "identity")

请注意我是如何将 rev- 交换的。使用 rev 做一些非常不同的事情:如果你颠倒列 Location 中值的顺序,它会按你碰巧得到的每一行的值堆叠,这可能是任何东西。