我试图通过设置levelplot
使用par(mfrow=c(2,1))
在一个窗口中放置多个点阵图,但似乎忽略了这一点。
在lattice
中设置多个绘图是否有特定的功能?
答案 0 :(得分:67)
'格子' package是在grid包上构建的,当' lattice'加载。但是,为了使用grid.layout
函数,您需要显式load()
pkg :: grid。另一个可能更容易的选择是pkg :: gridExtra中的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)
答案 1 :(得分:42)
Lattice 包经常(但不总是)忽略 par 命令,所以我只是在绘制w / Lattice 时避免使用它。
在单个页面上放置多个点阵图:
创建 (但不要绘制)格子/格子 绘图对象 ,然后
为每个情节致电 打印 一次
对于每个 print 调用,传入(i) plot 的参数; (ⅱ) 更多 ,设置为 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))
答案 2 :(得分:10)
阅读?print.trellis
后,这很简单。特别感兴趣的是split
参数。乍一看似乎很复杂,但一旦你明白它意味着它就会非常直截了当。来自文档:
split:一个4个整数的向量,c(x,y,nx,ny),表示将当前绘图定位在nx图的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
如您所见,split
有四个参数。 最后两个指的是框架的大小(类似于mfrow
所做的那样),而前两个参数将你的情节定位到{{1} } nx
框架。