如何使用 ggplot2 更改堆叠条形图的顺序和配色方案?
How to change the order and color scheme of stacked bar charts using ggplot2?
我正在尝试对这些进行排序,以便 Space 堆叠在时间之上,然后按时间的升序对它们进行排序。我还希望能够为每个堆栈选择颜色。
任何帮助将不胜感激!非常感谢!
数据如下:
structure(list(Beg = structure(c(20L, 19L, 18L, 15L, 1L, 3L,
6L, 10L, 13L, 8L, 5L, 11L, 9L, 7L, 2L, 4L, 17L, 16L, 14L, 12L,
20L, 19L, 18L, 15L, 1L, 3L, 6L, 10L, 13L, 8L, 5L, 11L, 9L, 7L,
2L, 4L, 17L, 16L, 14L, 12L), .Label = c("a", "b", "c", "d", "e",
"f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t"), class = "factor"), Cat = structure(c(2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L), .Label = c("Time", "Space"), class = "factor"),
Count = c(7824.92, 1006.79, 3570.93, 1484.5, 2885.32, 4194.84,
4348.94, 3603.31, 4826.33, 2225.49, 3350.02, 3778.35, 2698.51,
2247.01, 1705.17, 4742.72, 15231.15, 14083.26, 4437.68, 3109.09,
18875.45, 25816.95, 20836.93, 25501.53, 23996.55, 19427.12,
21467.89, 22472.71, 9876.27, 9548.99, 22171.83, 21179.33,
23358.26, 24763.62, 24551.94, 16726.11, 10691.68, 10537.26,
18012.88, 21453.15)), row.names = c(NA, -40L), class = "data.frame")
基本上你需要做的就是反转Cat
中的因素。这里我使用了 forcats
包。请注意,您的数据在此代码中为 df
:
library(forcats)
library(dplyr)
df %>%
mutate(Cat = forcats::fct_rev(Cat)) %>%
ggplot() +
geom_col(aes(Beg, Count, fill = Cat)) +
ggtitle("All Stuff") +
coord_flip() +
theme_classic()
要选择颜色,请像添加任何其他 ggplot 图层一样使用它。用您选择的颜色替换 "color1"
和 "color2"
:
scale_fill_manual(values = c("color1", "color2"))
添加到@NotThatKindODr 的回答中,您可以通过使用 forcats
包中的 fct_reorder
函数重新排序来按时间升序排列条形图:
library(dplyr)
library(forcats)
df <- df %>%
mutate(Cat = fct_rev(Cat),
Beg = fct_reorder(Beg, Count, max, .desc = T))
ggplot(df, aes(x = Beg, y = Count, fill = Cat)) +
geom_col() +
ggtitle("All Stuff") +
theme_classic() +
coord_flip()
给出:
我正在尝试对这些进行排序,以便 Space 堆叠在时间之上,然后按时间的升序对它们进行排序。我还希望能够为每个堆栈选择颜色。 任何帮助将不胜感激!非常感谢!
数据如下:
structure(list(Beg = structure(c(20L, 19L, 18L, 15L, 1L, 3L,
6L, 10L, 13L, 8L, 5L, 11L, 9L, 7L, 2L, 4L, 17L, 16L, 14L, 12L,
20L, 19L, 18L, 15L, 1L, 3L, 6L, 10L, 13L, 8L, 5L, 11L, 9L, 7L,
2L, 4L, 17L, 16L, 14L, 12L), .Label = c("a", "b", "c", "d", "e",
"f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t"), class = "factor"), Cat = structure(c(2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L), .Label = c("Time", "Space"), class = "factor"),
Count = c(7824.92, 1006.79, 3570.93, 1484.5, 2885.32, 4194.84,
4348.94, 3603.31, 4826.33, 2225.49, 3350.02, 3778.35, 2698.51,
2247.01, 1705.17, 4742.72, 15231.15, 14083.26, 4437.68, 3109.09,
18875.45, 25816.95, 20836.93, 25501.53, 23996.55, 19427.12,
21467.89, 22472.71, 9876.27, 9548.99, 22171.83, 21179.33,
23358.26, 24763.62, 24551.94, 16726.11, 10691.68, 10537.26,
18012.88, 21453.15)), row.names = c(NA, -40L), class = "data.frame")
基本上你需要做的就是反转Cat
中的因素。这里我使用了 forcats
包。请注意,您的数据在此代码中为 df
:
library(forcats)
library(dplyr)
df %>%
mutate(Cat = forcats::fct_rev(Cat)) %>%
ggplot() +
geom_col(aes(Beg, Count, fill = Cat)) +
ggtitle("All Stuff") +
coord_flip() +
theme_classic()
要选择颜色,请像添加任何其他 ggplot 图层一样使用它。用您选择的颜色替换 "color1"
和 "color2"
:
scale_fill_manual(values = c("color1", "color2"))
添加到@NotThatKindODr 的回答中,您可以通过使用 forcats
包中的 fct_reorder
函数重新排序来按时间升序排列条形图:
library(dplyr)
library(forcats)
df <- df %>%
mutate(Cat = fct_rev(Cat),
Beg = fct_reorder(Beg, Count, max, .desc = T))
ggplot(df, aes(x = Beg, y = Count, fill = Cat)) +
geom_col() +
ggtitle("All Stuff") +
theme_classic() +
coord_flip()
给出: