2016-05-04 23 views
0

Ich habe Daten, die mir diesenggplot2 In den Jitter-Positionen Offset

violin plot with points

wie diese

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)) 

und produzieren ein Grundstück mit diesem Code der

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

sehen gibt

Das ist 90% des Weges zu dem was ich will. Aber ich würde es gerne, wenn jeder Punkt nur über dem Violinplot für den passenden Assay-Typ aufgetragen würde. Das heißt, die jitterartigen Positionen der Punkte wurden so eingestellt, dass die Dreiecke immer nur auf dem oberen violetten Teelot und die Kreise auf dem unteren roten Violinplot für jeden Projekttyp waren.

Irgendwelche Ideen, wie man das macht?

Antwort

1

können Sie verwenden interaction zwischen Test & Projekt:

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() 

Die Markierung kann durch numerische skaliert x-Achse eingestellt werden:

# 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

2

Um das gewünschte Ergebnis zu erhalten Es ist wahrscheinlich am besten, position_jitterdodge zu verwenden, da dies die beste Kontrolle über die Art und Weise der Punkte gibt 'Jittered' sind:

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() 

die gibt:

enter image description here