ggplot2 的发散堆积条形图:图例中的因子排序问题
Divergent stacked bar chart with ggplot2: issue with factor ordering in legend
我正在尝试在 发散堆叠条形图 和 ggplot2
上绘制李克特量表数据。
我见过很多解决方案,其中我找到的最好的一个是 this faceted solution(虽然不需要 facets)。我特别欣赏这样一个事实,即对于奇数标度,中性值以 0 为中心。
我在这里以简化的方式重现了这个解决方案的想法(使用两个 geom_col()
和反向计数):
# Data sample
data <-
tibble(
question = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
option = c("Very bad", "Bad", "Neutral", "Good", "Exc",
"Very bad", "Bad", "Neutral", "Good", "Exc"),
count = c(1, 10, 4, 5, 3, 3, 4, 5, 6, 8)
) %>%
mutate(
option = option %>% factor(levels = c("Very bad", "Bad", "Neutral", "Good", "Exc")),
count = if_else(option == "Neutral", count/2, count)
)
# Divergent stacked bar chart
data %>%
ggplot(aes(question, count, fill = option)) +
geom_col(data = filter(data, option %in% c("Neutral", "Good", "Exc")),
position = position_stack(reverse = T)) +
geom_col(data = filter(data, option %in% c("Neutral", "Bad", "Very bad")),
aes(y = -count)) +
scale_fill_brewer(palette = "RdBu") +
coord_flip()
结果如下:
如您所见,情节的顺序是正确的,但图例和着色似乎忘记了因子排序(向因子添加 ordered = T
没有帮助)。
如果我删除第二个 geom_col()
,那么一切都很好,但这显然不是我的目标。
如何强制 ggplot2
保持图例中的因子顺序?
问题是默认情况下未使用的因子水平会下降。要解决您的问题,请在 scale_fill_brewer
中设置 drop=FALSE
:
不确定确切的内部结构,但这与您对不同数据集使用两个 geom_col
这一事实有关。
library(ggplot2)
# Divergent stacked bar chart
ggplot(data, aes(question, count, fill = option)) +
geom_col(data = filter(data, option %in% c("Neutral", "Good", "Exc")),
position = position_stack(reverse = T)) +
geom_col(data = filter(data, option %in% c("Neutral", "Bad", "Very bad")),
aes(y = -count)) +
scale_fill_brewer(palette = "RdBu", drop = FALSE) +
coord_flip()
我正在尝试在 发散堆叠条形图 和 ggplot2
上绘制李克特量表数据。
我见过很多解决方案,其中我找到的最好的一个是 this faceted solution(虽然不需要 facets)。我特别欣赏这样一个事实,即对于奇数标度,中性值以 0 为中心。
我在这里以简化的方式重现了这个解决方案的想法(使用两个 geom_col()
和反向计数):
# Data sample
data <-
tibble(
question = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
option = c("Very bad", "Bad", "Neutral", "Good", "Exc",
"Very bad", "Bad", "Neutral", "Good", "Exc"),
count = c(1, 10, 4, 5, 3, 3, 4, 5, 6, 8)
) %>%
mutate(
option = option %>% factor(levels = c("Very bad", "Bad", "Neutral", "Good", "Exc")),
count = if_else(option == "Neutral", count/2, count)
)
# Divergent stacked bar chart
data %>%
ggplot(aes(question, count, fill = option)) +
geom_col(data = filter(data, option %in% c("Neutral", "Good", "Exc")),
position = position_stack(reverse = T)) +
geom_col(data = filter(data, option %in% c("Neutral", "Bad", "Very bad")),
aes(y = -count)) +
scale_fill_brewer(palette = "RdBu") +
coord_flip()
结果如下:
如您所见,情节的顺序是正确的,但图例和着色似乎忘记了因子排序(向因子添加 ordered = T
没有帮助)。
如果我删除第二个 geom_col()
,那么一切都很好,但这显然不是我的目标。
如何强制 ggplot2
保持图例中的因子顺序?
问题是默认情况下未使用的因子水平会下降。要解决您的问题,请在 scale_fill_brewer
中设置 drop=FALSE
:
不确定确切的内部结构,但这与您对不同数据集使用两个 geom_col
这一事实有关。
library(ggplot2)
# Divergent stacked bar chart
ggplot(data, aes(question, count, fill = option)) +
geom_col(data = filter(data, option %in% c("Neutral", "Good", "Exc")),
position = position_stack(reverse = T)) +
geom_col(data = filter(data, option %in% c("Neutral", "Bad", "Very bad")),
aes(y = -count)) +
scale_fill_brewer(palette = "RdBu", drop = FALSE) +
coord_flip()