2016-12-16 5 views
1

У меня есть пара лесных участков, сделанных с использованием пакета R forestplot. Я хотел бы grid.arrange их - но, похоже, это не работает легко.Grid.arrange объекты лесного фонда

Пример:

library(forestplot) 
# A basic example, create some fake data 
row_names <- list(list("test = 1", expression(test >= 2))) 
test_data <- data.frame(coef=c(1.59, 1.24), 
        low=c(1.4, 0.78), 
        high=c(1.8, 1.55)) 

forestplot(row_names, 
     test_data$coef, 
     test_data$low, 
     test_data$high, 
     zero = 1, 
     cex = 2, 
     lineheight = "auto", 
     xlab = "Lab axis txt") 

Хорошо это нарисует сюжет. Теперь предположим, что я хочу, чтобы захватить, что в объект сюжете бок о бок с другим сюжетом:

fp1 <- forestplot(row_names, 
     test_data$coef, 
     test_data$low, 
     test_data$high, 
     zero = 1, 
     cex = 2, 
     lineheight = "auto", 
     xlab = "Lab axis txt") 

Следующая выдает ошибку:

> grid.arrange(fp1, fp1) 
Hit <Return> to see next plot: 
Error in gList(list(path = "GRID.VP.7537", name = "arrange.1-1-1-1", n = 2L, : 
only 'grobs' allowed in "gList" 

Так Клири FP1 не является Grob - но как Я достигаю этого другими способами?

ответ

1

См. Второй пример на страницах справки ?forestplot. который показывает, как это сделать.


forestplot, кажется, не вернуть сюжет: смотреть на str(fp1).

Пара вариантов: grid, чтобы создать пространство для проецирования (v1), или захватить график, а затем объединить (v2).


v1 с использованием сетки

library(grid) 
library(forestplot) 

# Create 2 rows by one columns viewport 
grid.newpage() 
pushViewport(viewport(layout=grid.layout(2, 1))) 

# Plot in viewport position 1x1 
pushViewport(viewport(layout.pos.row=1, layout.pos.col=1)) 
forestplot(row_names, 
     test_data$coef, 
     test_data$low, 
     test_data$high, 
     zero = 1, 
     cex = 2, 
     lineheight = "auto", 
     xlab = "Lab axis txt") 
upViewport(1) 

# Plot in viewport position 2x1 
pushViewport(viewport(layout.pos.row=2, layout.pos.col=1)) 
forestplot(row_names, 
     test_data$coef, 
     test_data$low, 
     test_data$high, 
     zero = 1, 
     cex = 2, 
     lineheight = "auto", 
     xlab = "Lab axis txt", 
     new_page = FALSE) 
upViewport(1) 

v2, захватить сюжет

fp1 <- grid.grabExpr(print(forestplot(row_names, 
     test_data$coef, 
     test_data$low, 
     test_data$high, 
     zero = 1, 
     cex = 2, 
     lineheight = "auto", 
     xlab = "Lab axis txt"))) 

gridExtra::grid.arrange(fp1, fp1) 
+0

THx пользователя. Вариант v1 дает мне ошибку: «Ошибка в UseMethod (« depth »): не применимый метод для« глубины », применяемый к объекту класса« NULL »'. Вариант v2 работает, но на моих реальных графиках у меня есть метки и заголовки, которые перекрываются, когда я устанавливаю 'gridExtra :: grid.arrange (fp1, fp2. Ncols = 2)' – user2498193

+1

@ user2498193; вы получаете сообщение об ошибке при копировании и вставке ответа v1 в новый сеанс R? (поскольку я не могу воспроизвести это). Re v2; это немного более темпераментно, потому что вам нужно настроить окно вывода или устройство для подходящего позиционирования. – user20650

+0

Да, все равно получите сообщение об ошибке в новой сессии. Eh re v2 - не знаю, как это сделать. Я начинаю думать, что могу просто сделать это вручную – user2498193

Смежные вопросы