Kann ich mit Datenrahmen in ggplot2 vermeiden?
Frage
Ich bin eine Monte-Carlo-Simulation ausgeführt und der Ausgang ist in der Form:
> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
> d
iter k1 k2
1 0.2 0.3
2 0.6 0.4
Die Plots ich generieren will, sind:
plot(d$iter, d$k1)
plot(density(d$k1))
Ich weiß, wie gleichwertige Grundstücke zu tun mit ggplot2, Konvertit Datenrahmen
new_d = data.frame(iter=rep(d$iter, 2),
k = c(d$k1, d$k2),
label = rep(c('k1', 'k2'), each=2))
dann ist Plotten einfach. Jedoch kann die Anzahl der Iterationen sehr groß und die Anzahl der ks auch groß sein kann. Diese Mittel etwa mit einem sehr großen Datenrahmen durcheinander.
Gibt es trotzdem, ich vermeiden, kann diesen neuen Datenrahmen zu schaffen?
Danke
Lösung
Kurze Antwort ist „Nein“ Sie können nicht vermeiden, einen Datenrahmen zu schaffen. ggplot
erfordert, dass die Daten in einem Datenrahmen sein. Wenn Sie qplot
verwenden, können Sie geben es Vektoren für x und y trennen, aber intern, es ist immer noch einen Datenrahmen aus den Parametern Erstellen Sie in übergeben.
Ich bin damit einverstanden Vorschlag mit Jubas - lernt die reshape
Funktion zu nutzen, oder besser noch das reshape
Paket mit melt
/ cast
Funktionen. Sobald Sie schnell mit Ihren Daten im langen Format setzen, die Schaffung erstaunliches ggplot
Graphen werden, einen Schritt näher!
Andere Tipps
Ja, es ist möglich, dass Sie einen Datenrahmen zu vermeiden erstellen: nur eine leere Argumentliste an die Basisschicht, ggplot()
geben. Hier ist ein komplettes Beispiel basierend auf Ihrem Code ein:
Bibliothek (ggplot2)
d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
# desired plots:
# plot(d$iter, d$k1)
# plot(density(d$k1))
ggplot() + geom_point(aes(x = d$iter, y = d$k1))
# there is not enough data for a good density plot,
# but this is how you would do it:
ggplot() + geom_density(aes(d$k1))
Beachten Sie, dass, obwohl dies ermöglicht Sie nicht um einen Datenrahmen zu schaffen, könnte ein Datenrahmen noch intern erstellt werden. Siehe beispielsweise der folgende Auszug aus ?geom_point
:
Es werden alle Objekte befestigte einen Datenrahmen zu erzeugen.
Sie können die reshape
Funktion verwenden, um Datenrahmen zu „lang“ Format zu umwandeln. sein kann es ein bisschen schneller als Ihr Code?
R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2"))
iter time k id
1.k1 1 k1 0.2 1
2.k1 2 k1 0.6 2
1.k2 1 k2 0.3 1
2.k2 2 k2 0.4 2
So zu den vorherigen Antworten nur hinzuzufügen. Mit qplot könnten Sie tun,
p <- qplot(y=d$k2, x=d$k1)
und dann von dort baut sie weiter, zum Beispiel mit
p + theme_bw()
Aber ich stimme -. Schmelze / cast ist genereally der Weg nach vorn