Gitter: mehrere Diagramme in einem Fenster?

70

Ich versuche, mithilfe levelplotder Einstellung mehrere Gitterdiagramme in ein Fenster einzufügenpar(mfrow=c(2,1)) aber dies scheint dies zu ignorieren.

Gibt es eine bestimmte Funktion zum Festlegen mehrerer Diagramme lattice?

Chris
quelle
3
Die latticeDiagramme verwenden die parEinstellungen im Allgemeinen nicht. Sie haben ihre eigenen Einstellungen aus Rastergrafiken. Siehe ?trellis.par.getfür eine Erklärung.
James

Antworten:

75

Das 'Gitter'-Paket basiert auf dem Gitterpaket und fügt seinen Namespace hinzu, wenn' Gitter 'geladen wird. Um die grid.layoutFunktion nutzen zu können, müssen Sie jedoch explizit load()pkg :: grid verwenden. Die andere Alternative, die wahrscheinlich einfacher ist, ist die grid.arrangeFunktion in pkg :: gridExtra:

 install.packages("gridExtra")
 require(gridExtra) # also loads grid
 require(lattice)
 x <- seq(pi/4, 5 * pi, length.out = 100)
 y <- seq(pi/4, 5 * pi, length.out = 100)
 r <- as.vector(sqrt(outer(x^2, y^2, "+")))

 grid <- expand.grid(x=x, y=y)
 grid$z <- cos(r^2) * exp(-r/(pi^3))
 plot1 <- levelplot(z~x*y, grid, cuts = 50, scales=list(log="e"), xlab="",
           ylab="", main="Weird Function", sub="with log scales",
           colorkey = FALSE, region = TRUE)

 plot2 <- levelplot(z~x*y, grid, cuts = 50, scales=list(log="e"), xlab="",
           ylab="", main="Weird Function", sub="with log scales",
           colorkey = FALSE, region = TRUE)
 grid.arrange(plot1,plot2, ncol=2)

Geben Sie hier die Bildbeschreibung ein

IRTFM
quelle
Hier finden Sie nette Beispiele.
M--
@ Masoud: Diese Seite verwendet nur Basisgrafiken. Die Frage betraf Gittergrafiken.
IRTFM
@ 42- Entschuldigung, ich wollte diesen Kommentar für eine andere Frage hinterlassen, während ich Ihre Antwort las. Du hast recht.
M--
42

Das Gitterpaket ignoriert oft (aber nicht immer) den Befehl par , daher vermeide ich es einfach, ihn beim Plotten mit Gitter zu verwenden .

So platzieren Sie mehrere Gitterdiagramme auf einer Seite:

  • erstellen (aber plotten nicht)die Gitter / Spalier Plot Objekte , dann

  • Rufen Sie print für jedes Grundstück einmal auf

  • Geben Sie für jeden Druckaufruf Argumente für (i) den Plot ein ; (ii) mehr , auf TRUE gesetzt und nur für den ersten Druckaufruf übergeben , und (iii) pos , das die Position jedes Diagramms auf der Seite angibt, die als xy-Koordinatenpaare für die untere linke Seite des Diagramms angegeben ist Ecke bzw. obere rechte Ecke - dh ein Vektor mit vier Zahlen.

viel einfacher zu zeigen als zu sagen:

data(AirPassengers)     # a dataset supplied with base R
AP = AirPassengers      # re-bind to save some typing

# split the AP data set into two pieces 
# so that we have unique data for each of the two plots
w1 = window(AP, start=c(1949, 1), end=c(1952, 1))
w2 = window(AP, start=c(1952, 1), end=c(1960, 12))

px1 = xyplot(w1)
px2 = xyplot(w2)

# arrange the two plots vertically
print(px1, position=c(0, .6, 1, 1), more=TRUE)
print(px2, position=c(0, 0, 1, .4))
Doug
quelle
3
Siehe auch das splitArgument zu ?print.trellisund Abschnitt 5.8 von Murrells "R-Grafiken" books.google.co.uk/books?id=78P4zntHHVQC
Richie Cotton
3
Wenn es gemeinsame Achsen gibt , ist auch die c.trellisVerknüpfung im latticeExtraPaket nützlich.
Qoheleth
11

Dies ist einfach, sobald Sie gelesen haben ?print.trellis. Von besonderem Interesse ist der splitParameter. Es mag auf den ersten Blick kompliziert erscheinen, aber es ist ziemlich einfach, wenn Sie erst einmal verstanden haben, was es bedeutet. Aus der Dokumentation:

split: Ein Vektor von 4 ganzen Zahlen, c (x, y, nx, ny), der besagt, dass das aktuelle Diagramm an der x, y-Position in einem regulären Array von nx durch ny Diagramme positioniert werden soll. (Hinweis: Dies hat seinen Ursprung oben links)

Sie können einige Implementierungen sehen example(print.trellis), aber hier ist eine, die ich bevorzuge:

library(lattice)

# Data
w <- as.matrix(dist(Loblolly))
x <- as.matrix(dist(HairEyeColor))
y <- as.matrix(dist(rock))
z <- as.matrix(dist(women))

# Plot assignments
pw <- levelplot(w, scales = list(draw = FALSE))  # "scales..." removes axes
px <- levelplot(x, scales = list(draw = FALSE))
py <- levelplot(y, scales = list(draw = FALSE))
pz <- levelplot(z, scales = list(draw = FALSE))

# Plot prints
print(pw, split = c(1, 1, 2, 2), more = TRUE)
print(px, split = c(2, 1, 2, 2), more = TRUE)
print(py, split = c(1, 2, 2, 2), more = TRUE)
print(pz, split = c(2, 2, 2, 2), more = FALSE)  # more = FALSE is redundant

Der obige Code gibt Ihnen diese Abbildung: Levelplots

Wie Sie sehen können, werden splitvier Parameter verwendet. Die letzten beiden beziehen sich auf die Größe Ihres Frames (ähnlich wie bei der mfrowAusführung), während die ersten beiden Parameter Ihr Diagramm im nxBy- nyFrame positionieren .

Waldir Leoncio
quelle