从构面网格中删除未使用的属性级别

问题描述 投票:0回答:1

如何使用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    
r ggplot2 facet-wrap facet-grid geom-col
1个回答
0
投票

问题在于您设置了

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")

© www.soinside.com 2019 - 2024. All rights reserved.