我经常制作箱线图,其中一些类别非常小,而其他类别则有大量数据,并叠加有抖动的原始数据点。我正在寻找一种可靠的方法来隐藏非常小的类别(N<5)的框和 mustache 。目标是这些小类别将使用 geom_point() 层仅显示原始数据,但有意义的类别将得到盒须处理。对我来说显而易见的事情是,将 geom_boxplot() 层中的 alpha 映射到基于 N 的因子变量,这不起作用,因为 alpha 只控制填充,也许还控制 geom_boxplot 中的异常值,而不是盒子和晶须。
我过去发现了一个复杂的解决方案,只要我愿意在这个问题上浪费颜色参数,它就可以工作。然而,通常我想实际将颜色用于其他用途,并且将其映射两次会导致输出粗糙。我想到的另一个笨拙的解决方案是使用一个已删除小类别的数据子集 - 该计划的问题是,当这些类别受position_dodge()影响时,它无法正确处理情况(因为闪避将“看到“类别太少)。
下面的最小示例。
df <- data.frame(group=factor(sample(c("A","B"), size=110, replace=TRUE)),
sex=factor(c(rep("M",50), rep("F", 50), rep("NB", 10))),
height=c(rnorm(50, 70, 6), rnorm(50, 63, 6), rnorm(10, 65, 6)))
dfsub <- filter(df, !(sex=="NB" & group=="A"))
ggplot(df, aes(x=group, y=height, colour=sex)) +
geom_boxplot(data=dfsub) +
geom_point(position=position_jitterdodge(jitter.width=0.2))
最佳答案
好吧,我认为这种方式不一定比您当前的选择更好,但是...您可以将箱线图和散点图的 df 拆分为 dfs,并修改要从中删除的数据的值箱线图超出范围(例如,此处为 1000)。然后绘制两者,最后使用 coord_cartesian 放大相关部分。
为了创建df_box
,我们按group
和sex
进行分组,并将具有< 5个数据点的组的值更改为1000(因此我们不必硬编码要更改的值)。
df <- data.frame(group=factor(sample(c("A","B"), size=110, replace=TRUE)),
sex=factor(c(rep("M",50), rep("F", 50), rep("NB", 10))),
height=c(rnorm(50, 70, 6), rnorm(50, 63, 6), rnorm(10, 65, 6)))
df_box <- df %>%
group_by(group, sex) %>%
mutate(temp = ifelse(n() < 5, 1000, 1)) %>%
ungroup() %>%
mutate(height = ifelse(temp == 1000, 1000, height)) %>%
select(-temp)
ggplot(df, aes(x=group, y=height, colour=sex)) +
geom_boxplot(data=df_box) +
geom_point(position=position_jitterdodge(jitter.width=0.2)) +
coord_cartesian(ylim=c(50,90))
关于r - 当 N 很小时,隐藏 geom_boxplot() 中的框和须线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58312728/