Решетка: несколько участков в одном окне? - PullRequest
61 голосов
/ 29 марта 2010

Я пытаюсь поместить несколько графиков решетки в одно окно, используя levelplot, установив par(mfrow=c(2,1)), но, похоже, это игнорирует.

Есть ли особая функция для установки нескольких графиков в lattice?

Ответы [ 3 ]

67 голосов
/ 03 мая 2012

Пакет 'lattice' построен на пакете grid и присоединяет свое пространство имен при загрузке 'lattice'. Однако для использования функции grid.layout вам необходимо явно load() pkg :: grid. Другой альтернативой, которая, вероятно, проще, является функция grid.arrange в 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

42 голосов
/ 29 марта 2010

Пакет Lattice часто (но не всегда) игнорирует команду par , поэтому я просто избегаю использовать ее при построении графиков w / Lattice .

Чтобы разместить несколько графиков решетки на одной странице:

  • создать (но не строить график) решетки/ trellis объекты сюжета , затем

  • вызов печать один раз для каждого сюжета

  • для каждого print call, передать аргументы для (i) plot ;(ii) больше , установлен на ИСТИНА , и который передается только для начального вызова 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))
10 голосов
/ 26 января 2016

Это легко сделать, прочитав ?print.trellis. Особый интерес представляет параметр split. Это может показаться сложным на первый взгляд, но это довольно просто, когда вы понимаете, что это значит. Из документации:

split: вектор из 4 целых чисел, c (x, y, nx, ny), который говорит о том, чтобы расположить текущий график в позиции x, y в регулярном массиве nx по ny графикам. (Примечание: это происхождение слева вверху)

Вы можете увидеть несколько реализаций на 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), тогда как первые два параметра позиционируют ваш график в кадре nx на ny .

...