用position = "dodge"
绘制误差线最近引起了我很多头痛...奇怪的是,用美学shape
或fill
(不适用于误差线)来避开它们做得好。但是,规避美观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)
会打印相同的图。
我希望使用相同的图,但通过与“ 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)
有人对此行为有解释吗?不应该将aes(group = ...)
和aes(fill = ...)
分组在闪避位置上的行为类似?
答案 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)