如何使用facet_grid将此图分成两部分(水平),以便底部网格仅包含狗,顶部网格仅包含猫。
我尝试过使用drop和scale,但无法让facet_grid将猫从狗方面删除,将狗从猫方面删除。
ggplot 代码:
ggplot(data = predictions, mapping = aes(fill=scenario, x=rel_change, y=attribute_level)) +
geom_col(position="dodge") +
theme_bw() +
scale_y_discrete(limits = c("red cat", "blue cat", "green cat","grey cat",
"red dog", "blue dog", "green dog", "grey dog")) +
scale_fill_discrete(breaks=c('a', 'b', 'c', 'd','e', 'f', 'g')) +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
geom_errorbar(aes(xmin = rel_lower, xmax = rel_upper), width = 0.4, position = position_dodge(0.9)) +
facet_grid(attribute~., scales = "free")
数据(示例):
# A tibble: 56 × 12
attribute attribute_level prob_colour sd lower upper abs_change rel_change rel_lower rel_upper scenario_no group
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 Dog grey dog 0.309 0.00867 0.296 0.328 0 0 0 0 1.1 a
2 Dog grey dog 0.347 0.0135 0.326 0.378 0 0 0 0 1.2 b
3 Dog grey dog 0.292 0.0113 0.274 0.314 0 0 0 0 1.3 c
4 Dog grey dog 0.316 0.00959 0.299 0.334 0 0 0 0 1.4 d
5 Dog grey dog 0.305 0.00836 0.292 0.324 0 0 0 0 1.5 e
6 Dog grey dog 0.354 0.0132 0.332 0.383 0 0 0 0 1.6 f
7 Dog grey dog 0.288 0.0111 0.269 0.309 0 0 0 0 1.7 g
8 Dog green dog 0.461 0.00752 0.444 0.473 0.152 0.492 0.438 0.532 2.1 a
9 Dog green dog 0.454 0.00846 0.437 0.468 0.107 0.307 0.260 0.349 2.2 b
10 Dog green dog 0.465 0.00811 0.450 0.481 0.174 0.596 0.545 0.649 2.3 c
问题在于您设置了
limits=
比例的 y
。因此,scales="free"
不会有任何效果。我只能猜测原因是为 y
尺度设置了特定的类别顺序。如果这是真的,那么您可以通过将 attribute_level
转换为一个因子,并根据您所需的顺序设置级别顺序来实现这两个目标。
使用基于 mtcars 的最小可重现示例。
让我们首先使用固定限制重现您的问题。当我修复限制时
scales="free_y"
没有效果。
library(ggplot2)
ggplot(mtcars, aes(y = factor(cyl), fill = factor(am))) +
geom_bar(position = "dodge") +
scale_y_discrete(limits = levels(factor(mtcars$cyl, levels = c(6, 8, 4)))) +
facet_grid(gear ~ ., scales = "free_y")
为了解决此问题并确保我所需的类别顺序,我将其转换为一个因子,其级别根据我所需的顺序设置,并将该因子映射到 y:
ggplot(mtcars, aes(y = factor(cyl, levels = c(6, 8, 4)), fill = factor(am))) +
geom_bar(position = "dodge") +
facet_grid(gear ~ ., scales = "free_y")