2016-05-04 8 views
5

Ich habe mehrere Vorschläge basierend auf mehreren Posts hier, sowie das Lesen der ggplot2-Dokumentation ausprobiert, aber diese Frage ist etwas anders, und ich habe nicht gefunden eine Lösung noch.Kombinieren von geom_point und geom_line mit position_jitterdodge in ggplot2 für zwei Gruppierungsfaktoren

Hier ist ein Code-Snippet einen geschmolzenen Datenrahmen ähnlich den mit arbeite ich zu machen:

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) 

Was ich will, ist ein Punkt-Diagramm mit b auf der x-Achse, C auf erstellen die y-Achse, wobei die Punkte auf der x-Achse nach d gruppiert sind und die Linien zwischen ihnen durch a gruppiert sind. Wenn wir nur darum, die Punkte auf dem Graphen wie so beginnen, kommt es aus fein:

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. Die Punkte sind farbcodiert nach Faktor d, und darüber hinaus sind sie auf der einen Seite, so dass jitterdodged x ist auf der linken Seite und y ist auf der rechten Seite.

Jetzt möchte ich nur die Punkte mit Linien nach Faktor a verbinden. This is a mocked-up version I made in MS Paint wie es aussehen soll. Hinzufügen eines geom_line und Einstellung der geom_line Gruppe eine Arbeit sollte ...

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

... aber es kommt kein Recht. Die Linien, die es erzeugt, sind die richtige Länge, um die richtigen Punkte zu verbinden, aber sie berühren sie kaum, es sieht so aus, als wären sie zufällig auf dem Graphen. Ich würde einen weiteren Screenshot hinzufügen, habe aber noch keine Rechte.

Außerdem, wenn ich die Gruppe Ästhetik zu sein in der ästhetischen Gesamt wie so ändern:

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

... dann werden die Punkte vertauscht, so dass sie in der falschen Position sind. Und auf jeden Fall sind die Linien noch nicht voll mit den Punkten.

Ich habe auch versucht, width und jitter.width Werte im position_jitterdodge() Teil zu spezifizieren, und die Linien und Punkte noch nicht richtig zusammenfügen. Ich habe auch die ggplot2-Dokumentation, einige vorherige stackoverflow-Fragen durchgelesen und die meisten Kombinationen von position_jitter, position_dodge, geom_jitter usw. ausprobiert, aber bisher kein Glück.

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Eine mögliche Lösung - Angabe Jitter-Werte 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

Danke, das perfekt funktioniert. Es ist nicht ideal, dies jedes Mal zu tun, aber es ist definitiv besser als die Punkte und Linien überall zu haben. – GFL

+1

Sie können dies in eine Funktion einfügen, einfach 'jitterVal <- runif (nrow (temp), max = 0,25)' plus Brüche und lables für 'scale_x_continuous' sollte ausreichen, damit es automatisch funktioniert. –

1

Sie die Interaktion zwischen d verwenden können und 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) 

mit der richtigen x-Achse. Konvertieren Sie die x auf numerische und setzen neue Etiketten

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

Hi Jimbou, das ist eine großartige Antwort, vielen Dank!Eine kleine Änderung an Ihrem Code wurde benötigt, um es für mich arbeiten zu lassen - d1 $ b zu temp $ b in der letzten Zeile zu ändern, um die Labels auf der X-Achse zu erhalten: 'p + scale_x_continuous (breaks = c (1.5, 3.5.5.5), Etiketten = Ebenen (Temp $ b)) ' – GFL

+1

@GFL behoben. Vielen Dank. – Jimbou

Verwandte Themen