2016-07-26 13 views
1

folgte ich this nette Antwort Split Violine Plots in einem 2x2-DesignOverlay scatterpoints auf Split Violine Stück mit ggplot2

Nun zu erzeugen vorstellen, dass diese Daten aus wiederholten Messungen in verschiedenen Fächern. Ich möchte zusätzlich die einzelnen Daten in einem Streudiagramm darstellen (ich weiß, dass die Handlung am Ende vielleicht zu beschäftigt ist, würde ich gerne zuerst sehen).

Ich bin fast da, aber habe einen kleinen Fehler, der wahrscheinlich leicht behoben ist. Ich füge ein ganzes Arbeitsbeispiel hinzu, falls es einen besseren Weg gibt, dies zu tun.

Dieser erste Teil I direkt aus der vorherige Frage kopiert:

library(dplyr) 
library(ggplot2) 

set.seed(20160229) 

ich subj meinen Datenrahmen hinzugefügt, weil ich jedes Lebewesen Mittelwert

my_data = data.frame(
    y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000, 1.5)), 
    x=c(rep('a', 2000), rep('b', 2000)), 
    m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000)), 
    subj=c(rep(c(rep('1',200),rep('2',200),rep('3',200),rep('4',200),rep('5',200)),4)) 
) 

pdat <- my_data %>% 
    group_by(x, m) %>% 
    do(data.frame(loc = density(.$y)$x, 
       dens = density(.$y)$y)) 

pdat$dens <- ifelse(pdat$m == 'i', pdat$dens * -1, pdat$dens) 
pdat$dens <- ifelse(pdat$x == 'b', pdat$dens + 1, pdat$dens) 


ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
    geom_polygon() + 
    scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) + 
    ylab('density') + 
    theme_minimal() + 
    theme(axis.title.x = element_blank()) 

Bisher plotten werden will, große Werke . Jetzt versuche ich meine Mittelwerte für jedes Thema hinzufügen

meanY = aggregate(y ~ x + m + subj, my_data, mean, drop=TRUE) 


ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
    geom_polygon() + 
    geom_point(data=meanY, aes(fill = m, group = interaction(m, x))) + 
    scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) + 
    ylab('density') + 
    theme_minimal() 

ich den Fehler: Error in eval(expr, envir, enclos) : object 'dens' not found

+0

versuchen, ein '+' nach dem Aufruf von 'geom_point()' – bouncyball

+0

@bouncyball Woops hinzufügen! Das war es nicht, aber danke. Ich werde die Frage bearbeiten. – elisa

Antwort

1

Wenn ich das richtig verstanden benötigen Sie x und y in geom_point angeben:

ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) + 
    geom_polygon() + 
    scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) + 
    ylab('density') + 
    theme_minimal() + 
    theme(axis.title.x = element_blank()) + 
    geom_point(data = meanY, aes(x = ifelse(x == "a", 0, 1), y = y, fill = m, group = interaction(m, x)), shape = 21, colour = "black", show.legend = FALSE) 

enter image description here

+1

Schön! Vielen Dank. Ich habe position = position_dodge (width = 0.5) hinzugefügt, um die Plots von der Mitte weg zu bekommen und es hat den Trick gemacht. – elisa

+3

position_jitterdodge wird (zumindest auf einem normalen Boxplot) die Punkte in die beiden Füllgruppen trennen – Ulrik

+0

@Ulrik sehr hilfreich, danke! Ich hatte es getan, indem ich sie an leicht getrennten x-Positionen zeichnete. Das ist viel eleganter – elisa