webentwicklung-frage-antwort-db.com.de

Zeichnen von zwei Variablen als Linien mit ggplot2 im selben Diagramm

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.

282
fmark

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"))
351
hadley

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()

ggplot2 output

342
rcs

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()

multiple series ggplot2

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
31
ecerulm

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

13
Gavin Simpson

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')

enter image description here

Mit diesem Format konnte ich jedoch keine korrekte Legende hinzufügen. Weiß jemand wie?

4
Papalagui