【问题标题】:Wrong position of dodged error bars when aes(group = ...) but not aes(fill/shape = ...)当 aes(group = ...) 而不是 aes(fill/shape = ...) 时,闪避误差条的位置错误
【发布时间】:2019-05-27 07:57:10
【问题描述】:

position = "dodge" 绘制误差线最近让我很头疼……奇怪的是,用美学shapefill(不应该适用于误差线)来避开它们似乎效果很好。然而,用美学躲避group 会将条形置于意想不到的位置。我想知道这是否可能是一个 ggplot2 错误。

我喜欢在条形图或箱线图后面放置自定义误差线。有时我会为情节的不同元素赋予特殊的颜色。出于这个原因,我经常将aes() 不包含在ggplot() 函数中,而是包含在geoms 或stats 中。

这是一个“放置良好”的错误栏示例:

library(ggplot2)
library(dplyr)

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0) 

这会产生警告Warning: Ignoring unknown aesthetics: fill。使用aes(shape = supp) 打印相同的图。

我希望得到相同的情节,但不会通过将填充/形状与“组”(aes(group = supp)) 交换来发出警告。这不会产生警告,但会产生非常意外的结果:

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)  

有人能解释一下这种行为吗?与aes(group = ...)aes(fill = ...) 分组不应该在闪避位置上表现相似吗?

【问题讨论】:

  • 使用group 并获得具有预期分组和躲避的情节的一种可能性是aes(group = interaction(supp, dose))。但是,我还不清楚aes(group = supp)aes(fill = supp) 之间的行为差​​异

标签: r ggplot2 errorbar aesthetics


【解决方案1】:

来自?aes_group_order(已添加重点):

默认情况下,组被设置为所有离散的交互 图中的变量。这通常会正确地对数据进行分区,但是 如果没有,或者图中没有使用离散变量, 您将需要通过映射显式定义分组结构 分组到每个组具有不同值的变量。

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge")

误差条组自动设置为剂量(已转换为因子,即离散变量)和 supp(已是 ToothGrowth 数据集中的一个因子)的交互作用。换句话说,每个剂量c(0.5, 1, 1.5) 和支持c("OJ", "VJ") 的组合都被视为一个单独的组,以便计算箱线图汇总统计。因此,显示的误差线与箱线图层完美匹配,即使填充与 geom_errorbar 的美学无关。

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge")

误差线组明确设置为 supp 和 only supp。这会覆盖默认行为,因此我们只有两个(一个用于“OJ”,一个用于“VJ”),而不是上面的 6 个组。这会导致误差线层和箱线图层不匹配。

您可以显式设置组映射以模仿默认行为:

p1 <- ToothGrowth %>%
  mutate(dose = factor(dose)) %>%
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = interaction(dose, supp)), geom = "errorbar", position = "dodge") +
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)
p1
layer_data(p1, 1L) # view data associated with error bar layer
layer_data(p1, 2L) # view data associated with boxplot layer

p2 <- ToothGrowth %>%
  mutate(dose = factor(dose)) %>%
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = interaction(supp, dose)), geom = "errorbar", position = "dodge")+
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)
p2
layer_data(p2, 1L) # view data associated with error bar layer
layer_data(p2, 2L) # view data associated with boxplot layer

注意: interaction(dose, supp)interaction(supp, dose) 将产生相同的图,外观方面,但如果您想比较与每一层关联的基础数据,interaction(dose, supp) 在与默认顺序相同,而interaction(supp, dose) 则没有。

【讨论】:

    【解决方案2】:

    代码忽略了未知的美学:填充

    stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") 
    

    而代码考虑到美学group = supp 并为 OJVC 提供了两个错误栏。

    stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge")
    

    完整代码

    library(ggplot2)
    library(dplyr)
    
    ToothGrowth %>% 
      mutate(dose = factor(dose)) %>% 
      ggplot(aes(dose, len)) +
      stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") +
      geom_boxplot(aes(fill = supp), position = "dodge", coef = 0) 
    
    Warning: Ignoring unknown aesthetics: fill
    
    
    
    ToothGrowth %>% 
      mutate(dose = factor(dose)) %>% 
      ggplot(aes(dose, len)) +
      stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge") + 
      geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)  
    

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多