2016-03-25 11 views
3

Dies ist etwas, mit dem ich experimentiert habe, um eine Lösung für eine Weile zu finden, aber im Grunde habe ich mich gefragt, ob es eine schnelle Möglichkeit gibt, Liniendiagramme für zwei verschiedene Datensätze in ggplot2 auszuwechseln.R - ggplot ausweichen geom_lines

Mein Code ist zur Zeit:

#Example data 
id <- c("A","A") 
var <- c(1,10) 
id_num <- c(1,1) 
df1 <- data.frame(id,var,id_num) 

id <- c("A","A") 
var <- c(1,15) 
id_num <- c(0.9,0.9) 
df2 <- data.frame(id,var,id_num) 


#Attempted plot 
dodge <- position_dodge(width=0.5) 
p<- ggplot(data= df1, aes(x=var, y=id)) + 
    geom_line(aes(colour="Group 1"),position="dodge") + 
    geom_line(data= df2,aes(x=var, y=id,colour="Group 2"),position="dodge") + 
    scale_color_manual("",values=c("salmon","skyblue2")) 
p 

Welche produziert:

enter image description here

Hier ist die "Gruppe 2" -Linie alle der "Gruppe 1" Linie versteckt, die nicht das, was ich ist wollen. Stattdessen möchte ich, dass die Zeile "Gruppe 2" unterhalb der Zeile "Gruppe 1" liegt. Ich habe mich umgesehen und diesen vorherigen Post gefunden: ggplot2 offset scatterplot points, aber ich kann nicht scheinen, um den Code anzupassen, um zwei geom_lines zu bekommen, um einander auszuweichen, wenn Sie getrennte Datenrahmen verwenden.

Ich habe meine Y-Variablen in numerische umgewandelt und sie leicht versetzt, um die gewünschte Ausgabe zu erhalten, aber ich fragte mich, ob es einen schnelleren/einfacheren Weg gäbe, das gleiche Ergebnis mit der Ausweichfunktion von ggplot oder etwas zu erhalten sonst.

Meine Arbeit um Code ist einfach:

p<- ggplot(data= df1, aes(x=var, y=id_num)) + 
    geom_line(aes(colour="Group 1")) + 
    geom_line(data= df2,aes(x=var, y=id_num,colour="Group 2")) + 
    scale_color_manual("",values=c("salmon","skyblue2")) + 
    scale_y_continuous(lim=c(0,1)) 
p 

Geben Sie mir meine gewünschte Ausgabe von:

gewünschte Ausgabe:

Desired output

Der numerische Ansatz kann ein wenig umständlich sein, wenn Ich versuche es zu erweitern, um es meinen tatsächlichen Daten anzupassen. Ich muss meine y-Werte in Faktoren umwandeln, sie in numerische Werte umwandeln und dann die Werte auf den zweiten Datensatz zusammenführen, so dass ein schnellerer Weg vorzuziehen wäre. Vielen Dank im Voraus für Ihre Hilfe!

+2

Sie müssen die beiden Datensätze in einem einzigen Datensatz kombinieren, damit das Ausweichen funktioniert – Thierry

+0

Wenn Ihre realen Datensätze wirklich so ähnlich sind lar, es wäre einfach, sie zusammen zu stapeln und einen Gruppenindex mit etwas wie 'bind_rows' aus * dplyr * hinzuzufügen. – aosmith

Antwort

3

Sie haben tatsächlich zwei Fragen hier:

  1. Wenn die beiden Linien werden mit zwei Schichten von geom_line() aufgetragen (weil Sie zwei Datenrahmen haben), dann jede Zeile „weiß nicht“ über die anderen. Daher können sie sich nicht ausweichen.

  2. position_dodge() wird verwendet, um in horizontaler Richtung auszuweichen. Das Standardbeispiel ist ein Balkendiagramm, in dem Sie verschiedene Balken nebeneinander (statt übereinander) platzieren. Sie möchten jedoch in vertikaler Richtung ausweichen.

Issue 1 wird durch Kombinieren der Datenrahmen in einem wie folgt gelöst:

library(dplyr) 
df_all <- bind_rows(Group1 = df1, Group2 = df2, .id = "group") 
df_all 
## Source: local data frame [4 x 4] 
## 
## group  id var id_num 
## (chr) (fctr) (dbl) (dbl) 
## 1 Group1  A  1 1.0 
## 2 Group1  A 10 1.0 
## 3 Group2  A  1 0.9 
## 4 Group2  A 15 0.9 

Hinweis, wie Einstellung .id = "Group" können bind_rows() eine Spalte group mit den von den Namen genommen Etiketten erzeugen, die zusammen verwendet wurden, mit df1 und df2.

Sie können dann beide Linien mit einem einzigen geom_line() Grundstück:

library(ggplot2) 
ggplot(data = df_all, aes(x=var, y=id, colour = group)) + 
    geom_line(position = position_dodge(width = 0.5)) + 
    scale_color_manual("",values=c("salmon","skyblue2")) 

enter image description here

habe ich auch position_dodge() Sie 2 Ausgabe explizit zu zeigen. Wenn Sie genau hinsehen, können Sie sehen, dass die rote Linie auf der linken Seite etwas hervorsteht. Dies ist die Folge der zwei Linien, die sich (nicht sehr erfolgreich) in vertikaler Richtung ausweichen.

Sie können Problem 2 lösen, indem Sie x- und y-Koordinaten austauschen. In dieser Situation horizontal Ausweichen ist das Richtige zu tun:

ggplot(data = df_all, aes(y=var, x=id, colour = group)) + 
    geom_line(position = position_dodge(width = 0.5)) + 
    scale_color_manual("",values=c("salmon","skyblue2")) 

enter image description here

Der letzte Schritt wird dann coord_flip() zu verwenden, um das gewünschte Grundstück zu erhalten:

ggplot(data = df_all, aes(y=var, x=id, colour = group)) + 
    geom_line(position = position_dodge(width = 0.5)) + 
    scale_color_manual("",values=c("salmon","skyblue2")) + 
    coord_flip() 

enter image description here

+0

Danke für die gründliche Antwort! Ich hatte gedacht, dass die zwei Linien nicht über jeden wissen, der das Ausweichen verursacht, um nicht zu arbeiten, aber danke für das Bestätigen. Schade, dass es keine einfachere Lösung gibt. –