У меня есть данные, которые выглядят так

df = data.frame(x=sample(1:5,100,replace=TRUE),y=rnorm(100),assay=sample(c('a','b'),100,replace=TRUE),project=rep(c('primary','secondary'),50))

И создаю сюжет, используя этот код

ggplot(df,aes(project,x)) + geom_violin(aes(fill=assay)) + geom_jitter(aes(shape=assay,colour=y),height=.5) + coord_flip()

Что дает мне это

violin plot with points

Это 90% пути к тому, что я хочу. Но я бы хотел, чтобы каждая точка была нанесена только поверх графика скрипки для соответствующего типа анализа. То есть, дрожащие положения точек были установлены таким образом, что треугольники всегда были только на верхнем графике бирюзовой скрипки, а кружки на нижнем красном графике скрипки для каждого типа проекта.

Есть идеи, как это сделать?

1
user1356855 4 Май 2016 в 14:22

2 ответа

Лучший ответ

Вы можете использовать interaction между анализом и анализом. проект:

p <- ggplot(df,aes(x = interaction(assay, project), y=x)) + 
     geom_violin(aes(fill=assay)) +  
     geom_jitter(aes(shape=assay, colour=y), height=.5, cex=4) 
p +  coord_flip()

Маркировка может быть скорректирована по оси x с числовым масштабированием:

# cbind the interaction as a numeric
df$group <- as.numeric(interaction(df$assay, df$project))
# plot
p <- ggplot(df,aes(x=group, y=x, group=cut_interval(group, n = 4))) + 
     geom_violin(aes(fill=assay)) +  
     geom_jitter(aes(shape=assay, colour=y), height=.5, cex=4) 
p +  coord_flip() + scale_x_continuous(breaks = c(1.5, 3.5), labels = levels(df$project))

enter image description here

1
Roman 4 Май 2016 в 12:19

Чтобы получить желаемый результат, вероятно, лучше всего использовать position_jitterdodge, поскольку это дает вам лучший контроль над "дрожанием" точек:

ggplot(df, aes(x = project, y = x, fill = assay, shape = assay, color = y)) + 
  geom_violin() + 
  geom_jitter(position = position_jitterdodge(dodge.width = 0.9,
                                              jitter.width = 0.5,
                                              jitter.height = 0.2),
              size = 2) + 
  coord_flip()

Который дает:

enter image description here

5
Jaap 5 Май 2016 в 08:44