2010-03-29 10 views
53

Estoy tratando de poner múltiples diagramas de celosía en una ventana usando levelplot estableciendo par(mfrow=c(2,1)) pero parece estar ignorando esto.Enrejado: ¿múltiples parcelas en una ventana?

¿Existe una función particular para configurar múltiples trazados en lattice?

+2

Los diagramas de 'celosía' no usan la configuración 'par' en general. Tienen su propio conjunto de configuraciones de los gráficos de Grid. Ver '? Trellis.par.get' para una explicación. – James

Respuesta

38

El Entramado paquete a menudo (pero no siempre) ignora el comando la par, y por eso sólo evitar su uso cuando se traza w/ de celosía.

colocar varias parcelas de celosía en una sola página:

  • crear (pero no PLOT) los objetos de celosía/enrejado parcela, entonces

  • llame al imprima una vez por cada parcela

  • para cada impresión llamada, pasar en argumentos para (i) la parcela; (Ii) más, ajuste a TRUE, y que sólo se pasa en la llamada inicial a impresión, y (iii) pos, lo que da la posición de cada trama en el página especificada como pares de coordenadas xy para la esquina inferior izquierda de la gráfica y la esquina superior derecha de , respectivamente, es decir, un vector con cuatro números.

mucho más fácil mostrar que decirle:

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)) 
+3

Vea también el argumento 'split' para'? Print.trellis' y la sección 5.8 de los "R graphics" de Murrell http://books.google.co.uk/books?id=78P4zntHHVQC –

+3

Si hay ejes comunes el 'c El atajo de .trellis' en el paquete 'latticeExtra' también es útil. – qoheleth

60

El paquete 'celosía' está incorporado en el paquete de la red y se conecta cuando su espacio de nombres 'enrejado' cargado. Sin embargo, para usar la función grid.layout, necesita explícitamente load() pkg :: grid. La otra alternativa, que es probablemente más fácil, es la función grid.arrange en paquete :: 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) 

enter image description here

+1

Esto es más claro que la respuesta aceptada. – qed

+0

[Aquí] (http://www.statmethods.net/advgraphs/layout.html) puede encontrar buenos ejemplos. – Masoud

+0

@Masoud: esa página solo usa gráficos base. La pregunta era sobre los gráficos de celosía. –

6

Esto es fácil de hacer una vez que lea ?print.trellis. De particular interés es el parámetro split. Puede parecer complicado a primera vista, pero es bastante sencillo una vez que comprenda lo que significa. De la documentación:

dividida: un vector de 4 números enteros, C (x, y, nx, ny), que dice a la posición de la trama actual en la posición X, Y en una matriz regular de nx por ny parcelas.(Nota: esto tiene origen en la parte superior izquierda)

Se puede ver un par de implementaciones en example(print.trellis), pero aquí hay uno 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 anterior le da esta figura: levelplots

Como puede ver, split toma cuatro parámetros. El dos últimos se refieren al tamaño de su marco (similar a lo que mfrow hace), mientras que la primera posición dos parámetros su diagrama en el nx por ny marco.

Cuestiones relacionadas