2012-07-30 30 views
24

Tôi thực sự đánh giá cao sự trợ giúp của bạn về vấn đề sau. Tôi biết một số cách để lưu một âm mưu duy nhất vào một tệp. Câu hỏi của tôi là: Làm cách nào để lưu một số nhiều số vào một tệp?R - lưu nhiều nhân tố vào tệp

Để bắt đầu, tôi không phải là người dùng R có kinh nghiệm. Tôi sử dụng ggplot2 để tạo các ô của tôi, và một điều khác tôi có lẽ nên đề cập đến là tôi sử dụng giao diện RStudio. Sử dụng example từ sách Cookbook R, tôi có thể tạo nhiều ô trong một cửa sổ.

Tôi muốn lưu cái gọi là hệ số này thành một tệp (tốt nhất là jpeg), nhưng bằng cách nào đó không thực hiện được điều này.

tôi là tạo ra các multiplot như sau:

##define multiplot function 
    multiplot <- function(..., plotlist=NULL, cols) { 
     require(grid) 

     # Make a list from the ... arguments and plotlist 
     plots <- c(list(...), plotlist) 

     numPlots = length(plots) 

     # Make the panel 
     plotCols = cols       # Number of columns of plots 
     plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols 

     # Set up the page 
     grid.newpage() 
     pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) 
     vplayout <- function(x, y) 
      viewport(layout.pos.row = x, layout.pos.col = y) 

     # Make each plot, in the correct location 
     for (i in 1:numPlots) { 
      curRow = ceiling(i/plotCols) 
      curCol = (i-1) %% plotCols + 1 
      print(plots[[i]], vp = vplayout(curRow, curCol)) 
     } 

    } 

## define subplots (short example here, I specified some more aesthetics in my script) 
plot1a <- qplot(variable1,variable2,data=Mydataframe1) 
plot1b <- qplot(variable1,variable3,data=Mydataframe1) 
plot1c <- qplot(variable1,variable2,data=Mydataframe2) 
plot1d <- qplot(variable1,variable3,data=Mydataframe2) 

## plot in one frame 
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2) 

này cho kết quả mong muốn. Vấn đề phát sinh khi tôi cố gắng lưu vào một tập tin. Tôi có thể làm điều này bằng tay trong RStudio (sử dụng Export -> Save plot as image), nhưng tôi muốn chạy mọi thứ trong một kịch bản. Tôi quản lý để tiết kiệm chỉ subplot1d (đó là last_plot()), và không phải là hoàn thành multiplot.

Những gì tôi đã cố gắng cho đến nay:

  1. Sử dụng ggsave

    ggsave(filename = "D:/R/plots/Myplots.jpg") 
    

    Điều này dẫn đến chỉ 1d âm mưu phụ được cứu rỗi.

  2. Sử dụng jpeg(), in() và dev.off()

    jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) 
    print(Myplot) 
    dev.off() 
    

    Điều này dẫn đến một hình ảnh hoàn toàn trắng (chỉ là nền tôi giả sử). in (Myplot) trả về NULL.

Không chắc mình đang làm gì sai ở đây. Sự thiếu hiểu biết của tôi R là lý do tôi đang cố gắng tìm một giải pháp. Bất cứ ai có thể giải thích những gì tôi đang làm sai và có lẽ đề nghị một cách để giải quyết vấn đề của tôi (s)?

+4

Bạn cũng có thể sử dụng lưới ** gridExtra ::.sắp xếp (plot1a, plot1b, plot1c, plot1d, ncol = 2) ** – dickoa

+0

Gói gridExtra không chứa grid.arrange, nó chứa sortGrob mà dường như cung cấp chức năng tương tự. Tôi cũng có vẻ nhớ một chức năng gọi là grid.arrange, có thể tác giả đã thay đổi chức năng tiêu đề trong gói. –

+0

'grid.arrange' phải ở trong gridExtra. Rõ ràng, một trong những lợi ích của 'arrangGrob' so với' multiplot' là nó tương thích với 'ggsave' và bạn có thể lưu trữ grob tổng hợp để sử dụng sau này. – baptiste

Trả lời

18

Bởi vì Myplot là giá trị trả về từ hàm multiplot của bạn và không trả về gì (công việc của nó là in biểu đồ). Bạn cần gọi số nhân với thiết bị jpeg mở:

jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) 
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2) 
dev.off() 

sẽ hoạt động.

+0

Nó thực sự là đơn giản! Cảm ơn rất nhiều vì đã giải thích tại sao phương pháp tiếp cận của tôi không hoạt động. –

17

Sử dụng example code (R sách dạy nấu ăn), nó làm việc cho tôi

png("chickweight.png") 
multiplot(p1, p2, p3, p4, cols=2) 
dev.off() 

enter image description here

+1

Bạn nói đúng, nhưng mã của bạn hơi khác so với @M_Vermeulen, trước tiên cô ấy vẽ 4 ô, mong đợi 'multiplot' trả về một đối tượng lưới. Có thể là 'grid.arrange' không hiển thị hành vi này? –

+0

@PaulHiemstra: Tôi không nghĩ rằng tôi đã thực hiện một cách tiếp cận khác ở đây, hãy xem trang ví dụ. Vấn đề thực sự đã được giải thích bởi @Spacedman rất tốt. Và có 'grid.arrange' hiển thị cùng một hành vi – dickoa

+0

Mã của bạn đã kết hợp sửa lỗi của @Spacedman, số nhân cần phải nằm trong lệnh gọi' png'. –

6

Và cho đầy đủ sake, ggsave không hoạt động vì nó chỉ tiết kiệm đối tượng ggplot in cuối cùng, do đó bạn trường hợp chỉ là cốt truyện cuối cùng. Điều này là do thực tế là multiplot tạo ra cốt truyện bằng cách vẽ các đối tượng ggplot vào các tập con khác nhau của tổng thiết bị đồ họa. Một cách khác là tạo cốt truyện bằng cách kết hợp các đối tượng ggplot vào một đối tượng ggplot lớn và sau đó in đối tượng. Điều này sẽ tương thích với ggsave. Cách tiếp cận này được thực hiện bởi arrangeGrob trong gói gridExtra.

+2

về mặt kỹ thuật, 'arrangGrob' không tạo ra" một đối tượng ggplot lớn ", nó trả về gTree của lớp" sắp xếp ", và nếu có ggplots trong danh sách trẻ em, thì lớp cũng kế thừa từ" ggplot "để đánh lừa ggsave . – baptiste

+0

Cảm ơn thông tin chi tiết hơn. –

Các vấn đề liên quan