graphs - Entramado: ¿múltiples parcelas en una ventana?
r interactive (3)
Estoy tratando de poner múltiples trazados de celosía en una ventana usando levelplot
estableciendo par(mfrow=c(2,1))
pero parece estar ignorando esto.
¿Hay una función particular para establecer múltiples trazados en lattice
?
El paquete ''lattice'' se basa en el paquete de cuadrícula y adjunta su espacio de nombres cuando se carga ''celosía''. Sin embargo, para usar la función grid.layout
, necesita load()
explícitamente load()
pkg :: grid. La otra alternativa, que probablemente sea más fácil, es la función grid.arrange
en 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)
El paquete de celosía a menudo (pero no siempre) ignora el comando par , así que simplemente evito usarlo al trazar w / Lattice .
Para colocar múltiples diagramas de celosía en una sola página:
crear (pero no trazar) los objetos de la trama reticulado / enrejado, luego
llame imprimir una vez por cada trama
para cada llamada impresa , envíe argumentos para (i) la trama ; (ii) más , establecido en TRUE , y que solo se transfiere para la llamada inicial a imprimir , y (iii) pos , que proporciona la posición de cada gráfico en la página especificada como pares de coordenadas xy para la parte inferior izquierda de la gráfica esquina y esquina superior derecha, respectivamente - es decir, un vector con cuatro números.
mucho más fácil de mostrar que contar:
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))
Esto es simple de hacer una vez que lea ?print.trellis
. De particular interés es el parámetro de split
. Puede parecer complicado a primera vista, pero es bastante sencillo una vez que comprenda lo que significa. De la documentación:
split: un vector de 4 enteros, c (x, y, nx, ny), que dice que se debe posicionar el gráfico actual en la posición x, y en una matriz regular de nx por ny gráficos. (Nota: este tiene origen en la parte superior izquierda)
Puede ver un par de implementaciones en example(print.trellis)
, pero aquí hay una que prefiero:
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
El código de arriba te da esta figura:
Como puede ver, split
toma cuatro parámetros. Los dos últimos se refieren al tamaño de su marco (similar a lo que hace mfrow
), mientras que los primeros dos parámetros posicionan su trazado en el marco nx
by ny
.