Наложение точек geom () на boxplot geom(fill=group)?

вот мой код на данный момент:

require(ggplot2)
value <- rnorm(40, mean = 10, sd = 1)
variable <- c(rep('A', 20), rep('B', 20))
group <- rep(c('Control', 'Disease'), 20)
data <- data.frame(value, variable, group)

ggplot(data, aes(x=variable, y=value)) +
  geom_boxplot(aes(fill=group)) +
  geom_point(aes())

это делит boxplots на группы по переменным, как я хотел бы. Однако точки для всех групп накладываются, и я хотел бы, чтобы он был разделен на группы. Как мне это сделать?

4 ответов


использовать position_dodge() для точек, а также добавить group=group внутри aes() of geom_point().

ggplot(data, aes(x=variable, y=value)) +
  geom_boxplot(aes(fill=group)) +
  geom_point(position=position_dodge(width=0.75),aes(group=group))

enter image description here


Я не знаю, когда это было введено, но есть новый (ish), который называется position_jitterdodge, что упрощает это, хотите ли вы дрожать или нет. Использование:

ggplot(data, aes(x=variable, y=value, fill=group)) +
  geom_boxplot() +
  geom_point(position=position_jitterdodge())
  # or, if you dont need jittering
  # geom_point(position=position_jitterdodge(jitter.width = 0, jitter.height = 0)) 

jittered overlay

http://ggplot2.tidyverse.org/reference/position_jitterdodge.html


вы можете попробовать ggbeeswarm Как хорошо. Здесь я сравниваю выход geom_beeswarm и geom_quasirandom:

library(ggbeeswarm)
library(ggplot2)

ggplot(data, aes(x=variable, y=value, fill=group)) +
  geom_boxplot() +
  geom_beeswarm(dodge.width=0.75) +
  geom_quasirandom(dodge.width=.75, col=2) 

enter image description here


вот попытка применить предложение Дидзиса к набору данных, где не все группы имеют выбросы, и, таким образом, точки не совпадают с правильным полем. enter image description here

файл данных: https://cmu.box.com/shared/static/2hxp2oms5et1ktr9hukdr539b6svq1cg.rds

require(data.table)
require(ggplot2)

d <- readRDS("2hxp2oms5et1ktr9hukdr539b6svq1cg.rds")

ggplot(d) + 
  geom_boxplot(aes(x=factor(game),y=N,fill=.group),outlier.shape=NA) + 
  geom_point(data=dd.sum1[,.SD[which(N %in% boxplot.stats(N)$out)],by=game][,.group:=factor(.group,levels=.groups)][,],aes(x=factor(game),y=N,color=.group,group=.group),
             position=position_dodge(width=0.75),
             size=.5) +
  facet_grid (type~., scales="free_x", space="free_x") +
  xlab("Game number") +
  ylab("Count") +
  scale_color_brewer("Group",palette="Set1",drop=FALSE) +
  scale_fill_brewer("Group",palette="Set1",drop=FALSE) +
  theme(axis.text.x=element_text(size=7),legend.position="top")