In ggplot2
kann man eine Grafik einfach in einem R-Objekt speichern.
p = ggplot(...) + geom_point() # does not display the graph
p # displays the graph
Die Standardfunktion plot
erzeugt die Grafik als ungültige Funktion und gibt NULL zurück.
p = plot(1:10) # displays the graph
p # NULL
Ist es möglich, eine von plot
in einem Objekt erstellte Grafik zu speichern ?
plot
ist eine generische und verschiedeneplot
Methoden geben solche Objekte zurück, soweit ich weiß.plot.default
kehrt jedoch tatsächlich zurückNULL
.p
nach dem Speichern als Objekt neu zu zeichnen ? Oder möchten Sie es als Objekt speichern, das Sie dann beispielsweise ändern können?Antworten:
Basisgrafiken werden direkt auf einem Gerät gezeichnet.
Du könntest benutzen
1-
recordPlot
2- das kürzlich eingeführte
gridGraphics
Paket , um Basisgrafiken in ihre Rasteräquivalente zu konvertierenHier ist ein minimales Beispiel:
plot(1:10) p <- recordPlot() plot.new() ## clean up device p # redraw ## grab the scene as a grid object library(gridGraphics) library(grid) grid.echo() a <- grid.grab() ## draw it, changes optional grid.newpage() a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10)) grid.draw(a)
quelle
saveRDS(object = p, file = "p.Rds")
, lade ich eine neue R-Sitzung, führe sie aus,p <- readRDS(file = "p.Rds")
gefolgt vonp
einer FehlermeldungError in replayPlot(x) : loading snapshot from a different session
. Speichere ich dasp
Objekt falsch?gridGraphics
hier gezeigte Methode verwendete, wurden die Farben auf dem neu gezeichneten Plot immer wieder durcheinander gebracht, selbst mitgrid.grab(wrap=TRUE)
Ich bin sehr spät dran, aber es war die erste Frage, die auftauchte, als ich nach der Frage suchte. Daher möchte ich meine Lösung für zukünftige Zuschauer hinzufügen, die auf die Frage stoßen.
Ich habe dies gelöst, indem ich eine Funktion anstelle eines Objekts verwendet habe. Angenommen, wir möchten zwei Beta-Verteilungen mit unterschiedlichen Parametern vergleichen. Wir können rennen:
z1<-rbeta(10000,5,5) z2<-rbeta(10000,20,20) plotit<-function(vector,alpha,beta){ plot(density(vector),xlim=c(0,1)) abline(v=alpha/(alpha+beta),lty="longdash") }
Und speichern Sie die Diagramme als Funktionen und nicht als Objekte.
z.plot1<-function(){plotit(z1,5,5)} z.plot2<-function(){plotit(z2,20,20)}
Als nächstes können wir jedes Diagramm wie gewünscht aufrufen, indem wir einfach die beiden Diagramme als Funktionen und nicht als Objekte aufrufen.
zeichnet die erste Handlung und
zeichnet die zweite.
Hoffe das hilft jemandem, der später darüber stolpert!
quelle
recordPlot
ist definitiv nützlich (wenn Sie ein Fenster bereits geöffnet haben), aber diese Antwort ist genau das, wonach Leute suchen, wenn sie diesen Beitrag besuchen. +1!Sie können die aktive Bindungsfunktion des
pryr
Pakets verwenden, wenn Sie die Werte des erstellten Objekts nicht direkt ändern möchten.library(pryr) a %<a-% plot(1:10,1:10)
Jedes Mal, wenn Sie
a
auf der Konsole eingeben, wird das Diagramm auf dem Bildschirm neu gedruckt. Der%<a-%
Operator führt das Skript jedes Mal erneut aus (im Fall eines Diagramms ist dies meines Erachtens kein Problem). Im Wesentlichen wird also jedes Mal, wenn Siea
den Code verwenden, erneut ausgeführt, was zu Ihrem Diagramm führt, das Sie natürlich bearbeiten (ein anderes Diagramm darüber legen) oder beispielsweise mit speichern könnenpng
. Es wird jedoch kein Wert selbst gespeicherta
. Der Wert bleibt weiterhin NULL.Ich weiß nicht, ob das, was Sie suchen, das ist, aber es könnte eine akzeptable Lösung sein.
quelle
plot(1:10);abline(v=4)
zum Beispiel)? +1a %<a-% {plot(1:10);abline(v=4)}
. Wenn Sie es in diese geschweiften Klammern eingeben, können Sie so viele Zeilen haben, wie Sie möchten! Wenn Sie einen Wert neu zuweisen möchten,a
müssen Sie ihn zuerst mit entfernenrm(a)
und dann mit neu zuweisen der%<a-%
Betreiber sonst erhalten Sie eine Warnung. Ich weiß nicht, warum dies passiert, aber ich denke, es ist keine große Sache.%<a-%
tut. Danke%<d-%
, es könnte später nützlich sein. Ich bin froh, dass ich helfen konnte :)library(ggplot2) # if mygraph is a plot object ggsave("myplot1.png",mygraph) # if the plot is in a list (e.g. created by the Bibliometrics package) ggsave("myplot1.png",mygraphs[[1]])
quelle