2016-07-11 5 views
2

Ich habe eine Reihe von Datenrahmen und ich möchte 2 Spalten von jedem Datenrahmen auf dem gleichen ggplot plotten. Ich habe bereits einen Plot von einer anderen Funktion, blau und rot gefärbt, und ich möchte, dass die neuen hinzugefügt werden. Obwohl die Art, wie ich versuche, auf der Konsole funktioniert, kann ich die Funktion nicht speichern, sie aufrufen und ausführen lassen. Der Fehler, den ich bekommen ist:Plotten von Datenrahmen in der gleichen ggplot mit for-Schleife in einer Funktion

Discrete value supplied to continuous scale. 

Also, der Datenrahmen in meiner Umgebung ist und BEFMORN1 zu BEFMORN9 benannt. Das erste Diagramm ist test_plot.

Der erste Teil, der mir den test_plot gibt funktioniert.

test_plot<-ggplot()+geom_point(data=yy4, aes(x=Time, y=Dist), colour="red")+geom_point(data=zz4, aes(x=Time, y=Dist), colour="blue") 
test_plot<-test_plot+scale_x_continuous(name="Time (Seconds from the beginning)") 
test_plot<-test_plot+scale_y_continuous(name="Distance (Metres from the beginning)") 

Der zweite Teil wird die neue Funktion

plot_all_runs<-function(r,test_plot) { 
for (i in 1:(length(r[[1]]))) { 
z<-as.data.frame(mget(ls(pattern=paste0("BEFMORN",i)))) 
test_plot2<-test_plot+geom_point(data=z, aes_string(x=names(z)[12], y=names(z)[17])) 
}print(test_plot2) 
} 

r eine Liste von 6 Listen der verschiedenen Datenrahmen ist, also aus BEFMORN r kam [[1]]. BEFNOON wird von r [[2]] usw. kommen. Mein Plan ist also, 6 identische Funktionen mit verschiedenen Argumenten in paste0 zu haben.

Ich verwende aes_string(x=names(z)[12], weil die Datenrahmen z unterschiedliche Spaltennamen in jeder Iteration haben werden.

Versteht jemand, warum ich einen Fehler erhalte? Ich habe mit der Waage herumgespielt (sie von der ersten Handlung entfernt oder sie im nächsten wieder hinzugefügt), aber keine Verbesserung.

BEARBEITEN: Alle zu plottenden Spalten wurden in numerische umgewandelt. Andere sind Faktoren und ganze Zahlen.

Beispiel

BEFMORN1<-data.frame(BEFMORN1.Time=seq(0:10, 0.5), BEFMORN1.Dist=1:20) 
BEFMORN2<-data.frame(BEFMORN2.Time=seq(0:13, 0.5), BEFMORN2.Dist=c(1:8,8,8,9,10,13,13,13,13.5,14,14,14 14:20)) 
yy4<-data.frame(Time=seq(0:10, 0.5). Dist=c(1:8,8,8,9,10,13,14:20)) 
ZZ4<-data.frame(Time=seq(0:12, 0.5). Dist=c(1:8,8,8,9,9.5,10,10.5,12,12.5,13,14:20)) 

test_plot<-ggplot()+geom_point(data=yy4, aes(x=Time, y=Dist), colour="red")+geom_point(data=zz4, aes(x=Time, y=Dist), colour="blue") 

plot_all_runs<-function(test_plot) { 
for (i in 1:9) { 
z<-as.data.frame(mget(ls(pattern=paste0("BEFMORN",i)))) 
test_plot2<-test_plot+geom_point(data=z, aes_string(x=names(z)[12], y=names(z)[17])) 
}print(test_plot2) 
} 
+1

Der Grund für den Fehler liegt in der Regel daran, dass die Daten weit und nicht lang formatiert sind und ggplot sie als diskrete Variablen interpretiert. Abgesehen davon ist es ziemlich schwierig, ohne ein reproduzierbares Beispiel zu helfen (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Möchten Sie mehrere Kurven zu einem einzelnen Diagramm hinzufügen oder mehrere Diagramme ausdrucken? – biomiha

+0

mehrere Kurven zu einem einzigen Plot – Nikos

+2

In diesem Fall die Datenrahmen zu einem verschmelzen (keine Notwendigkeit für Schleifen - es gibt viele bessere Optionen), transformieren Sie die Daten in langes Format und Farbe durch welche Variable definiert Ihre Kurven. – biomiha

Antwort

1

Ein Beispiel für das lange Format @biomiha und @joran Erzeugung vorgeschlagen:

library(ggplot2) 

BEFMORN1<-data.frame(Time=seq(0,10, 0.5) 
        , Dist=1:21, Group = "BEFMORN1") 
BEFMORN2<-data.frame(Time=seq(0,13, 0.5) 
        , Dist=c(1:8,8,8,9,10,13,13,13,13.5,14,14,14,14:21) 
        , Group = "BEFMORN2") 
yy4<-data.frame(Time=seq(0,10, 0.5) 
       , Dist=c(1:8,8,8,9,10,13,14:21) 
       , Group = "yy4") 
zz4<-data.frame(Time=seq(0,12, 0.5) 
       , Dist=c(1:8,8,8,9,9.5,10,10.5,12,12.5,13,14:21) 
       , Group = "zz4") 


allData <- 
    rbind(BEFMORN1, BEFMORN2, yy4, zz4) 


ggplot(allData 
     , aes(x = Time 
      , y = Dist 
      , col = Group)) + 
    geom_point() 

Beachten Sie, dass, wenn Ihre Daten bereits vorhanden sind, eine "Gruppe" Hinzufügen Spalte muss möglicherweise mit etwas mehr Sorgfalt durchgeführt werden. Das allgemeine Prinzip ist jedoch das gleiche. Wenn Sie möchten, können Sie eine der scale_color_* Funktionen verwenden, um die Standardfarben zu ändern, einschließlich scale_color_manual, wenn Sie sie selbst einstellen möchten.

+0

Ja, das hat funktioniert. Es bedurfte einiger zusätzlicher Aufmerksamkeit in der ganzen Untermenge (ich hatte eine Liste von 6 Listen mit verschiedenen Anzahlen von Datenrahmen) und zwei For-Schleifen, um die neue Variable automatisch für jeden Datenrahmen in jeder Liste der Liste zu machen! Danke allen für die Hilfe! (Mein Beispiel ist zu kompliziert und spezifisch, um in diesem Thread wertvoll zu sein, also werde ich es nicht hochladen. Wenn jemand es sehen will, werde ich mich bemühen, es zu erklären.) – Nikos

Verwandte Themen