2016-05-04 9 views
5

Ho provato diversi suggerimenti basati su diversi post qui, oltre a leggere la documentazione di ggplot2, ma questa domanda è leggermente diversa e non ho trovato una soluzione ancora.Combinazione di geom_point e geom_line con position_jitterdodge in ggplot2 per due fattori di raggruppamento

Ecco un frammento di codice per fare un dataframe fuso simile a quello con cui sto lavorando:

a <- c(1,2,3,4,5,6,1,2,3,4,5,6) 
b <- c("loss", "draw", "win", "draw", "loss", "win", "loss", "draw", "win", "draw", "loss", "win") 
c <- c(2,3,5,4,4,5,4,4,3,5,2,4) 
d <- c(rep("x", 6), rep("y", 6)) 
temp <- data.frame(a,b,c,d) 

Quello che voglio è quello di creare un diagramma a punti con B sul l'asse x, C ON l'asse y, con i punti sull'asse x raggruppati per d e le linee tra loro raggruppati per a. Se partiamo da solo mettendo i punti sul grafico in questo modo, si tratta bene fuori:

ggplot(temp, aes(x=b, y=c, fill=d, colour=d))+ 
    geom_point(position=position_jitterdodge()) 

This is the dot plot I get, which is how I want it to look. I punti sono color-coded in base al fattore D, e per di più stanno jitterdodged su un lato in modo che x è a sinistra e y è a destra.

Ora, tutto ciò che voglio è connettere i punti con le linee in base al fattore a. This is a mocked-up version I made in MS Paint di come dovrebbe apparire. L'aggiunta di un geom_line e l'impostazione del gruppo geom_line ad una dovrebbe funzionare ...

ggplot(temp, aes(x=b, y=c, fill=d, colour=d))+ 
    geom_point(position=position_jitterdodge())+ 
    geom_line(aes(group=a),position=position_jitterdodge()) 

... ma non venire fuori a destra. Le linee che crea sono della lunghezza giusta per collegare i punti corretti, ma a malapena riescono a toccarli, sembra che siano sul grafico a caso. Vorrei aggiungere un altro screenshot, ma non ho ancora i privilegi.

Inoltre, se cambio il gruppo estetica di essere in l'estetica complessiva in questo modo:

ggplot(temp, aes(x=b, y=c, fill=d, colour=d, aes(group=a)))+ 
    geom_point(position=position_jitterdodge())+ 
    geom_line(position=position_jitterdodge()) 

... allora i punti vengono commutate in giro in modo che siano nella posizione sbagliata. E in ogni caso, le linee continuano a non unirsi pienamente ai punti.

Ho anche provato a specificare i valori di larghezza e jitter.width nella parte position_jitterdodge(), e le linee e i punti ancora non si uniscono correttamente. Ho anche letto la documentazione di ggplot2, diverse precedenti domande StackOverflow e ho provato molte combinazioni di position_jitter, position_dodge, geom_jitter, ecc., Ma finora non ho avuto fortuna.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

1

una possibile soluzione - specificando valori di jitter manualy:

library(ggplot2) 

a <- c(1,2,3,4,5,6,1,2,3,4,5,6) 
# b <- c("loss", "draw", "win", "draw", "loss", "win", "loss", "draw", "win", "draw", "loss", "win") 
b <- c(2, 1, 3, 1, 2, 3, 2, 1, 3, 1, 2, 3) 
c <- c(2, 3, 5, 4, 4, 5, 4, 4, 3, 5, 2, 4) 
d <- c(rep("x", 6), rep("y", 6)) 
temp <- data.frame(a,b,c,d) 

set.seed(2016) 
jitterVal <- runif(12, max = 0.25) 
jitterVal <- jitterVal * ifelse(temp$d == "x", -1, +1) 

ggplot(temp, aes(x = b + jitterVal, y = c, fill = d, colour = d)) + 
    geom_point() + 
    geom_line(aes(group = a)) + 
    scale_x_continuous(breaks = c(1, 2, 3), labels = c("draw", "loss", "win")) + 
    xlab(NULL) + 
    expand_limits(x = c(0.5, 3.5)) 
+0

Grazie, questo funziona perfettamente. Non è l'ideale per farlo ogni volta, ma è decisamente meglio che avere i punti e le linee dappertutto. – GFL

+1

Puoi racchiuderlo in una funzione, semplice 'jitterVal <- runif (nrow (temp), max = 0.25)' più interruzioni e lables per 'scale_x_continuous' dovrebbero essere sufficienti per farlo funzionare automaticamente. –

1

È possibile utilizzare l'interazione tra d e b:

p <- ggplot(temp, aes(x=interaction(d, b), y=c, fill=d, colour=d))+ theme_classic()+ 
    geom_point() 
p + geom_line(aes(group=a),colour=1) 

con l'asse x corretta. Convertire la x per numerici e impostare nuove etichette

p <- ggplot(temp, aes(x=as.numeric(interaction(d,b)), y=c, fill=d, colour=d))+ theme_classic()+ 
    geom_point() 
p <- p + geom_line(aes(group=a),colour=1) 
p + scale_x_continuous(breaks = c(1.5,3.5,5.5), labels = levels(temp$b)) 

enter image description here

+0

Ciao Jimbou, questa è un'ottima risposta, grazie mille!Un piccolo emendamento al tuo codice era necessario per farlo funzionare per me - cambiando d1 $ b in temp $ b nell'ultima riga per ottenere le etichette sull'asse x: 'p + scale_x_continue (pause = c (1.5, 3,5,5,5), labels = levels (temp $ b)) ' – GFL

+1

@GFL ha risolto questo problema. Grazie. – Jimbou

Problemi correlati