web-dev-qa-db-fra.com

Treillis: plusieurs tracés dans une seule fenêtre?

J'essaie de mettre plusieurs tracés de réseau dans une fenêtre en utilisant levelplot en définissant par(mfrow=c(2,1)) mais il semble ignorer cela.

Existe-t-il une fonction particulière pour définir plusieurs tracés dans lattice?

62
Chris

Le package "lattice" est construit sur le package grid et attache son espace de noms lors du chargement de "lattice". Cependant, pour utiliser la fonction grid.layout, Vous devez explicitement load() pkg :: grid. L'autre alternative, qui est probablement plus facile, est la fonction grid.arrange Dans 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)

enter image description here

68
42-

Le package Lattice ignore souvent (mais pas toujours) la commande par , donc j'évite simplement de l'utiliser lors du traçage avec Lattice .

Pour placer plusieurs tracés de réseau sur une seule page:

  • créer (mais ne pas tracer) le treillis/treillage tracer des objets , puis

  • appeler imprimer une fois pour chaque tracé

  • pour chaque appel print , passez des arguments pour (i) le tracé ; (ii) plus , réglé sur [~ # ~] true [~ # ~] , et qui n'est transmis que pour l'appel initial à print , et (iii) pos , qui donne la position de chaque tracé sur la page spécifiée sous forme de paires de coordonnées xy pour le coin inférieur gauche et supérieur droit du tracé -hand corner, respectivement - c'est-à-dire un vecteur à quatre nombres.

beaucoup plus facile à montrer qu'à dire:

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))
42
doug

C'est simple à faire une fois que vous avez lu ?print.trellis. Le paramètre split est particulièrement intéressant. Cela peut sembler compliqué à première vue, mais c'est assez simple une fois que vous comprenez ce que cela signifie. De la documentation:

split: un vecteur de 4 entiers, c (x, y, nx, ny), qui dit de positionner le tracé courant à la position x, y dans un tableau régulier de nx par ny tracés. (Remarque: l'origine est en haut à gauche)

Vous pouvez voir quelques implémentations sur example(print.trellis), mais en voici une que je préfère:

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

Le code ci-dessus vous donne ce chiffre: levelplots

Comme vous pouvez le voir, split prend quatre paramètres. Les deux derniers font référence à la taille de votre cadre (similaire à ce que fait mfrow), tandis que le les deux premiers paramètres positionnent votre tracé dans le cadre nx by ny.

10
Waldir Leoncio