3

绘制误差线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) 

情节1

这会产生警告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)  

情节2

有人会对这种行为做出解释吗?不应该在闪避位置分组aes(group = ...)aes(fill = ...)表现相似吗?

4

2 回答 2

1

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

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)  
于 2019-05-27T09:55:40.643 回答
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 且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)不会。

于 2019-06-04T05:12:36.007 回答