72

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

是否有用于设置多个绘图的特定功能lattice

4

3 回答 3

77

'lattice' 包建立在 grid 包之上,并在 'lattice' 加载时附加其命名空间。但是,为了使用该grid.layout功能,您需要显式地load()pkg::grid。另一种可能更简单的替代方法是grid.arrangepkg::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)

在此处输入图像描述

于 2012-05-02T21:17:50.550 回答
42

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

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

  • 创建(但不绘制)格子/格子图对象,然后

  • 每个情节调用一次print

  • 对于每个打印调用,为 (i)绘图传递参数;(ii) more,设置为TRUE,仅在初始调用时传入print,以及 (iii) pos,将页面上每个绘图的位置指定为绘图左下角的 xy 坐标对分别是角和右上角——即一个有四个数字的向量。

展示比讲述容易得多:

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))
于 2010-03-29T19:10:29.130 回答
11

阅读后,这很容易做到?print.trellis。特别感兴趣的是split参数。乍一看似乎很复杂,但是一旦您理解了它的含义,它就会非常简单。从文档中:

split:一个由 4 个整数组成的向量 c(x,y,nx,ny),表示将当前绘图定位在 nx x ny 绘图的常规数组中的 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

上面的代码为您提供了这个数字: 水平图

如您所见,split有四个参数。最后两个是指您的框架的大小(类似于什么mfrow),而前两个参数将您的绘图定位到nxby nyframe。

于 2016-01-26T13:43:16.683 回答