格子: 一个窗口中的多个图形?

我试图通过设置 par(mfrow=c(2,1))来使用 levelplot在一个窗口中放置多个格点图,但似乎忽略了这一点。

lattice中是否有设置多个地块的特殊函数?

58374 次浏览

格子包经常(但不总是)忽略 标准命令,所以我只是在绘制 w/格子时避免使用它。

在一页上放置多个格子图:

  • 然后创建 (但不绘制)格子/格子 阴谋目标

  • 每个地块调用 < em > print 一次

  • 对于每个 打印调用,传入(i) 阴谋的参数; (ii) more, set to 没错, and which is only passed in for the initial call to 打印, and (iii) < em > pos , which gives the position of each plot on the page specified as x-y coordinate pairs for the plot's lower left-hand corner and upper right-hand 角点,即一个四位数的向量。

表现出来比说出来容易得多:

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

格子包是在网格包上构建的,并在加载格子包时附加其名称空间。但是,为了使用 grid.layout函数,需要显式地使用 load() pkg: : grid。另一个可能更简单的替代方法是 pkg: : grid 中的 grid.arrange函数:

 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

一旦你阅读了 ?print.trellis,这是很容易做到的。特别感兴趣的是 split参数。乍看起来可能很复杂,但是一旦你理解了它的含义,就会明白它的意思。根据文件:

拆分: 一个包含4个整数的向量,c (x,y,nx,ny) ,它表示通过 ny 图将当前图形定位在一个正则的 nx 数组中的 x,y 位置。(注意: 左上角为原点)

你可以在 example(print.trellis)上看到一些实现,但是这里有一个我更喜欢的:

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

上面的代码给出了这个图: levelplots

如您所见,split有四个参数。最后两个指的是你的帧的大小(类似于 mfrow的功能) ,而 前两个参数通过 ny帧将你的绘图定位到 nx