当aes(group = ...)而不是aes(fill / shape = ...)时,躲避的误差线的位置错误

时间:2019-05-27 07:57:11

标签: r ggplot2 errorbar aesthetics

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) 

Plot1

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

我希望使用相同的图,但通过与“ group”(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)  

Plot2

有人对此行为有解释吗?不应该将aes(group = ...)aes(fill = ...)分组在闪避位置上的行为类似?

2 个答案:

答案 0 :(得分: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。这将覆盖默认行为,因此,我们只有两个(而不是上面的6个组)(一个用于“ OJ”,一个用于“ VJ”)。这导致误差线层和箱线图层之间不匹配。

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

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)将在外观上产生相同的图,尽管如果您要比较与每个图层关联的基础数据,{{ 1}}会按照默认顺序生成组,而interaction(dose, supp)不会。

答案 1 :(得分:0)

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

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

代码考虑了group = supp的美观性,并分别为 OJ VC 提供了两个错误栏。

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)