【发布时间】:2018-05-24 14:08:25
【问题描述】:
我正在尝试为跨越多个因素的 2 个组创建一个箱线图以及观察次数的标签。当一个组和一个因子水平没有观察值时,带有观察值的组的框会占用两者的空间并且看起来很奇怪。
小例子:
library(tidyverse)
mtcars %>%
select(mpg, cyl,am) %>%
filter(!(cyl == 8 & am == 0)) %>%
ggplot(aes(factor(cyl),mpg,fill=factor(am))) +
stat_boxplot(geom = "errorbar") + ## Draw horizontal lines across ends of whiskers
geom_boxplot(outlier.shape=1, outlier.size=3,
position = position_dodge(width = 0.75)) +
geom_text(data = mtcars %>%
select(mpg, cyl, am) %>%
filter(!(cyl == 8 & am == 0)) %>%
group_by(cyl, am) %>%
summarize(Count = n(),
q3 = quantile(mpg, 0.75),
iqr = IQR(mpg),
lab_pos = max(ifelse(mpg < q3+1.5*iqr, mpg, NA), na.rm = TRUE)),
aes(x= factor(cyl), y = lab_pos,label = paste0("n = ",Count, "\n")),
position = position_dodge(width = 0.75))
产生:
有没有办法让am(1) 的框在cyl(8) 宽度的一半,所以它与情节上的其他框一致?我曾尝试使用虚假数据,但这会导致am(0) 的计数标签位于cyl(8)。
【问题讨论】:
-
根据在线 ggplot2 手册,(ggplot2.tidyverse.org/reference/position_dodge.html) 你应该可以使用
position = position_dodge(preserve = "single")。我尝试对此进行测试,但即使我似乎拥有最新版本的 ggplot2 (2.2.1),也无法使其正常工作。 -
看起来
preserve = "single"应该完全符合我的要求。但我得到一个“未使用的参数错误”。这是要报告为错误的东西吗?