Збереження сюжету grid.arrange () у файл


137

Я намагаюся побудувати кілька сюжетів за допомогою ggplot2, упорядкувавши їх за допомогою grid.arrange(). Оскільки мені вдалося знайти когось, що описує точну проблему, яку я маю, я описував опис проблеми за посиланням :

Коли я використовую ggsave()після grid.arrange(), тобто

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

Я не зберігаю графік сітки, але останній окремий ggplot. Чи є який-небудь спосіб насправді зберегти сюжет як відображений за grid.arrange()допомогою ggsave()чи щось подібне? Окрім використання старшого способу

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

Це ж посилання дає рішення нижче:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

Однак я не можу зрозуміти, як використовувати ggsave()для збереження висновку grid.arrange()виклику в наступному коді, який взято за посиланням :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

6
Використанняpng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Андрі

2
Ні print(ggplot())?
IRTFM

@DWin Так, певно! :-)
Андрі

1
@Andrie Що ви пропонуєте, працює, але роздільна здатність зображення дуже низька. Коли я зберігаю сингл ggplotза допомогою ggsave(), роздільна здатність зображення набагато вище. Чи є спосіб зберегти вихід grid.arrange()з високою роздільною здатністю, як це було б, якби це був збережений єдиний сюжет ggsave()? Якщо я надам, наприклад, варіанти, png(...,height=1600, width=2500)зображення виглядає дуже розмитим.
Мені подобається Код

Відповіді:


142

grid.arrangeмалює безпосередньо на пристрої. arrangeGrobз іншого боку, не малює нічого, але повертає могилу g, через яку можна перейти ggsave(file="whatever.pdf", g).

Причина, по якій вона працює інакше, ніж з ggplot-об’єктами, де за замовчуванням зберігається останній сюжет, якщо він не вказаний, є те, що ggplot2 невидимо відстежує останній сюжет, і я не думаю, що grid.arrangeслід пов'язувати цей лічильник з приватним пакетом.


3
Коли я намагаюся це, я отримую помилку, повідомляючи мені, що g неправильного типу?
Джек Едлі

@JackAidley задайте нове запитання з мінімальним прикладним відтворюваним прикладом та вашим sessionInfo () (переконайтеся, що у вас є останні версії R та пакунків).
баптист

3
@DaveX, не поширюйте цю оманливу інформацію; plot(g)це не правильний спосіб відображення gtable, скористайтеся grid.draw(g)натомість.
баптист

@baptiste Спасибі і перероблено: Зверніть увагу , що якщо ви намагаєтеся побачити результат g <-arrangeGrob(...)з print(g)ви отримаєте текстову таблицю зі списком графічних об'єктів , а не графіки. Спробуйте grid.draw(g)зобразити графіку як графіку. -
Дейв Х

7
ggsave вже не працює з (деякими або всіма) гробами.
vak

47

У мене були деякі проблеми з пропозицією бабтиста, але я отримав його нарешті. Ось що вам слід використовувати:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Це має добре працювати.


24

Ще один простий спосіб зберегти grid.arrange у pdf-файл - це використовувати pdf ():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

Це дозволяє об'єднати в розташуванні інші речі, ніж ggplots, як таблиці ...


7

Я думав, що варто до цього додати. У мене виникли проблеми з вищезазначеним, і ggsave викликає помилку: "сюжет повинен бути графіком ggplot2"

Завдяки цій відповіді: Збереження графіка з ggsave після використання ggplot_build та ggplot_gtable У мене є поправка до вищевказаного коду.

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

Вищенаведений рядок, необхідний для виправлення помилки

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Зараз у мене це чудово працює.


Мені це було потрібно. Мабуть, розроблена версія ggplot2 видаляє помилку класу-тесту як цю, але версія CRAN на даний момент (2015-10-21) цього не робить.
Дейв X

2
Це працює для marrangeGrob для мене, але не для аранжування або grid.arrange. @ DaveX, чи потрібно було робити щось інше, щоб він працював, окрім зміни ggsave, як показано вище? Дякую!
k13

3

Вам не потрібно використовувати organGrob, ви можете призначити результат grid.arrange безпосередньо на графік і зберегти це за допомогою ggsave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

Ще одне просте рішення: відразу після вашого grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

ти робиш dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.