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
中值的顺序,它会按你碰巧得到的每一行的值堆叠,这可能是任何东西。
我正在使用 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
中值的顺序,它会按你碰巧得到的每一行的值堆叠,这可能是任何东西。