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
?
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)
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))
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:
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
.