2010-09-23 8 views
203

Einer sehr newbish Frage mit ggplot2, aber sagen, dass ich Daten wie diese:Plotten zwei Variablen als Linien in der gleichen Grafik

test_data <- 
    data.frame(
    var0 = 100 + c(0, cumsum(runif(49, -20, 20))), 
    var1 = 150 + c(0, cumsum(runif(49, -10, 10))), 
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) 
) 

Wie kann ich beiden Zeitreihen var0 und var1 in der gleichen Grafik zeichnen, mit date auf der x-Achse, mit ggplot2? Bonuspunkte, wenn Sie var0 und var1 verschiedene Farben machen, und können eine Legende enthalten!

Ich bin sicher, das ist sehr einfach, aber ich kann keine Beispiele finden.

Antwort

259

Für eine kleine Anzahl von Variablen, können Sie sich die Handlung aufbauen manuell verwenden:

ggplot(test_data, aes(date)) + 
    geom_line(aes(y = var0, colour = "var0")) + 
    geom_line(aes(y = var1, colour = "var1")) 
+1

schönes Beispiel, aber wie man meine eigenen Farben anpasst (ZB schwarz und orange) ?, weil es scheint, dass Sie 'color =' als Variablennamen verwenden. –

+8

Verwenden Sie eine Skala .... – hadley

+3

'+ scale_colour_manual (Werte = c (" schwarz "," orange "))' –

12

Arbeiten mit Daten:

test_data <- data.frame(
var0 = 100 + c(0, cumsum(runif(49, -20, 20))), 
var1 = 150 + c(0, cumsum(runif(49, -10, 10))), 
Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100)) 

ich eine gestapelte Version, die, was ggplot() ist, würde gerne arbeiten:

stacked <- with(test_data, 
       data.frame(value = c(var0, var1), 
          variable = factor(rep(c("Var0","Var1"), 
               each = NROW(test_data))), 
          Dates = rep(Dates, 2))) 

In diesem Fall stacked Herstellung war ganz einfach, wie wir nur zu machen Sie ein paar Manipulationen, aber reshape() und die reshape und reshape2 könnten nützlich sein, wenn Sie eine komplexere reale Datenmenge zu manipulieren haben.

Sobald die Daten in dieser gestapelter Form sind, es erfordert nur einen einfachen ggplot() Aufruf um den Plot erzeugen Sie mit allen Extras (ein Grund, warum auf höherer Ebene Plotten Pakete wie lattice und ggplot2 sind so nützlich) gesucht:

require(ggplot2) 
p <- ggplot(stacked, aes(Dates, value, colour = variable)) 
p + geom_line() 

ich werde es Ihnen überlassen, die Achsenbeschriftungen aufzuräumen, Legende Titel usw.

HTH

+1

Ich glaube, Sie habe ein falsches parens in deinem Code da oben. Ich denke, das ist, was Sie suchen: gestapelt <- mit (test_data, data.frame (Wert = c (var0, var1), Variable = Faktor (rep (c ("Var0", "Var1"))), jeweils = NROW (test_data), Daten = rep (Datum, 2))). Auch, was ist der Zweck der Spalte "jeder"? Und ist das nicht nur eine gewundene und weniger effiziente Art, die Daten zu schmelzen, wie von rcs gezeigt? Ich denke, ich könnte mir einen Fall vorstellen, in dem das Schmelzen die Arbeit nicht erledigen würde, aber es ist mit ziemlicher Sicherheit das richtige Werkzeug für diesen Job, es sei denn, ich verpasse etwas. – Chase

+1

@chase, sorry, das ist Emacs ESS bekommen die Einrückung falsch. Jedes ist ein Argument für 'rep()', also bekommen wir wirklich nur 3 Spalten in 'stacked'. Ich werde den Code bearbeiten, um den Einzug klarer zu machen. –

+1

@chase; Ihr Kommentar zu 'melt()' ist gut gemacht, und ich stelle fest, dass das Umgestaltungspaket [2] hier nützlich wäre. Ich bin nicht so gut mit reshape2 vertraut und für eine solche einfache Manipulation ist es komplizierter als ein Aufruf an 'schmelzen()', es war weniger Aufwand, da ich nicht lesen musste, wie man 'schmelzen() '. Und rcs schlich sich mit seiner Antwort ein, während ich meins produzierte; Als ich mit der Antwort begann, gab es keine Antworten. mehr als eine Möglichkeit, eine Katze zu häuten - wie sie sagen! ;-) –

272

Der allgemeine Ansatz ist es, die Daten zu lang-Format zu konvertieren (mit melt() von Paket reshape oder reshape2) oder gather() vom tidyr Paket:

library("reshape2") 
library("ggplot2") 

test_data_long <- melt(test_data, id="date") # convert to long format 

ggplot(data=test_data_long, 
     aes(x=date, y=value, colour=variable)) + 
     geom_line() 

ggplot2 output

+4

Sie können auch die 'gather()' -Funktion von 'tidyr' verwenden, um die Daten zu schmelzen:' gather (test_data, variable, value, -date) ' – janosdivenyi

12

Sie benötigen die Daten für "ggplot2" im Format "groß" statt "breit". "Wide" bedeutet eine Beobachtung pro Zeile mit jeder Variablen als eine andere Spalte (wie Sie jetzt haben). Sie müssen es in ein "hohes" Format umwandeln, in dem Sie eine Spalte haben, die Ihnen den Namen der Variablen und eine andere Spalte mitteilt, die Ihnen den Wert der Variablen mitteilt. Der Prozess des Übergangs von breit nach groß wird gewöhnlich als "Schmelzen" bezeichnet.Sie können tidyr::gather verwenden, um Ihre Datenrahmen zu schmelzen:

library(ggplot2) 
library(tidyr) 

test_data <- 
    data.frame(
    var0 = 100 + c(0, cumsum(runif(49, -20, 20))), 
    var1 = 150 + c(0, cumsum(runif(49, -10, 10))), 
    date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) 
) 
test_data %>% 
    gather(key,value, var0, var1) %>% 
    ggplot(aes(x=date, y=value, colour=key)) + 
    geom_line() 

multiple series ggplot2

einfach klar zu sein, die data dass ggplot nach verbraucht es über gather kochend sieht wie folgt aus:

date  key  value 
2002-01-01 var0 100.00000 
2002-02-01 var0 115.16388 
... 
2007-11-01 var1 114.86302 
2007-12-01 var1 119.30996