Eine sehr neue Frage, aber sagen wir, ich habe Daten wie diese:
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 beide Zeitreihen var0
und var1
mit date
auf der x-Achse mit ggplot2
auf dieselbe Grafik zeichnen? Bonuspunkte, wenn Sie var0
und var1
in verschiedenen Farben herstellen und eine Legende einfügen können!
Ich bin mir sicher, dass dies sehr einfach ist, aber ich kann da draußen keine Beispiele finden.
Für eine kleine Anzahl von Variablen können Sie den Plot manuell erstellen:
ggplot(test_data, aes(date)) +
geom_line(aes(y = var0, colour = "var0")) +
geom_line(aes(y = var1, colour = "var1"))
Die allgemeine Vorgehensweise besteht darin, die Daten in ein Langformat umzuwandeln (unter Verwendung von melt()
aus dem Paket reshape
oder reshape2
) oder gather()
aus dem Paket tidyr
:
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()
Für ggplot2 müssen die Daten im Format "groß" statt "breit" vorliegen. "wide" bedeutet, eine Beobachtung pro Zeile mit jeder Variablen als eine andere Spalte zu haben (wie Sie es jetzt getan haben). Sie müssen es in ein "hohes" Format konvertieren, in dem Sie eine Spalte mit dem Namen der Variablen und eine andere Spalte mit dem Wert der Variablen haben. Der Übergang von weit nach hoch wird gewöhnlich als "Schmelzen" bezeichnet. Sie können tidyr::gather
verwenden, um Ihren 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()
Um klar zu sein, sieht das data
, das ggplot
verbraucht, nachdem es über gather
weitergeleitet wurde, folgendermaßen 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
Verwendung Ihrer 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 erstelle eine gestapelte Version, mit der ggplot()
arbeiten möchte:
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 war es recht einfach, stacked
zu produzieren, da wir nur ein paar Manipulationen durchführen mussten, aber reshape()
und reshape
und reshape2
könnten nützlich sein, wenn Sie mehr haben komplexe reale Datenmenge zu manipulieren.
Sobald die Daten in dieser gestapelten Form vorliegen, ist nur ein einfacher Aufruf von ggplot()
erforderlich, um das gewünschte Diagramm mit allen Extras zu erstellen (ein Grund, warum übergeordnete Diagrammpakete wie lattice
und ggplot2
sind so nützlich):
require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()
Ich überlasse es Ihnen, die Achsenbeschriftungen, Legendentitel usw. aufzuräumen.
HTH
Ich bin auch neu in R, versuche aber zu verstehen, wie ggplot funktioniert. Ich glaube, ich bekomme einen anderen Weg, es zu tun. Ich teile es nur wahrscheinlich nicht als vollkommen perfekte Lösung, sondern um einige verschiedene Standpunkte hinzuzufügen.
Ich weiß, dass ggplot besser für die Arbeit mit Datenrahmen geeignet ist, aber vielleicht kann es auch manchmal nützlich sein zu wissen, dass Sie zwei Vektoren direkt zeichnen können, ohne einen Datenrahmen zu verwenden.
Lade Daten. Die ursprüngliche Länge des Datumsvektors beträgt 100, während var0 und var1 die Länge 50 haben. Ich zeichne daher nur die verfügbaren Daten (die ersten 50 Daten).
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=50)
Plotten
ggplot() + geom_line(aes(x=date,y=var0),color='red') +
geom_line(aes(x=date,y=var1),color='blue') +
ylab('Values')+xlab('date')
Mit diesem Format konnte ich jedoch keine korrekte Legende hinzufügen. Weiß jemand wie?