2016-09-28 20 views
8

Tôi vẽ biểu đồ bằng ggplot2 và tôi có hàm facet_wrap để tạo nhiều biểu đồ (~ 51) nhưng tất cả chúng đều xuất hiện trên một trang. Bây giờ sau khi tìm kiếm, tôi phát hiện ra rằng ggplot2 không thể đặt đồ thị trên nhiều trang.ggplot2: Lô trên nhiều trang

Có cách nào để thực hiện việc này không? Tôi đã xem câu hỏi này (Multiple graphs over multiple pages using ggplot) và đã thử mã, với rất ít thành công. Đây là mã của tôi cho đồ thị của tôi, nó tạo ra ~ 51 đồ thị trên một trang, làm cho chúng rất nhỏ và khó thấy, nếu tôi có thể in 1 đồ thị trên mỗi trang trong pdf, điều đó sẽ rất tuyệt vời:

ggplot(indbill, aes(x = prey, y = weight), tab) + 
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
facet_wrap(~ individual) + 
theme(axis.ticks.x = element_blank(), 
    axis.text.x = element_text(size=rel(0.5)), 
    axis.ticks.y = element_blank(), 
    axis.text.y = element_blank()) + 
xlab("") + ylab("") + 
guides(color = guide_legend(ncol=2)) + 
coord_radar() 

Nếu ai đó có thể viết mã nhỏ và giải thích cho tôi, điều đó thật tuyệt!

Cảm ơn!

Trả lời

8

Một lựa chọn là chỉ cần cốt truyện, nói, sáu cấp độ individual tại một thời điểm sử dụng mã tương tự như bạn đang sử dụng bây giờ. Bạn sẽ chỉ cần lặp lại nó nhiều lần, một lần cho mỗi tập hợp con dữ liệu của bạn. Bạn đã không cung cấp dữ liệu mẫu, vì vậy đây là một ví dụ bằng cách sử dụng khung Baseball dữ liệu:

library(ggplot2) 
library(vcd) # For the Baseball data 
data(Baseball) 

pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
    print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ], 
        aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw()) 
} 
dev.off() 

Đoạn mã trên sẽ tạo ra một tập tin PDF với bốn trang của lô, mỗi với sáu khía cạnh đến một trang. Bạn cũng có thể tạo ra bốn tập tin PDF riêng biệt, một cho mỗi nhóm gồm sáu khía cạnh:

for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    ...ggplot code... 
dev.off() 
} 

Một lựa chọn khác, nếu bạn cần linh hoạt hơn, là để tạo ra một cốt truyện riêng biệt cho từng cấp (có nghĩa là, mỗi giá trị duy nhất) của biến facetting và lưu tất cả các ô riêng lẻ trong một danh sách. Sau đó, bạn có thể bố trí bất kỳ số lượng ô nào trên mỗi trang. Đó có thể là quá mức cần thiết ở đây, nhưng here's an example nơi tính linh hoạt có ích.

Trước tiên, hãy tạo tất cả các ô. Chúng tôi sẽ sử dụng team87 làm cột mặt của chúng tôi. Vì vậy, chúng tôi muốn tạo một ô cho mỗi cấp độ team87. Chúng tôi sẽ thực hiện việc này bằng cách chia nhỏ dữ liệu theo team87 và tạo một lô riêng biệt cho từng tập hợp con của dữ liệu.

Trong mã bên dưới, split chia dữ liệu thành các khung dữ liệu riêng biệt cho mỗi cấp độ team87. Trình bao bọc lapply tuần tự cấp dữ liệu mỗi tập con dữ liệu vào ggplot để tạo ra một âm mưu cho mỗi nhóm. Chúng tôi lưu đầu ra trong plist, một danh sách (trong trường hợp này) 24 ô.

plist = lapply(split(Baseball, Baseball$team87), function(d) { 
    ggplot(d, aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw() + 
    theme(plot.margin=unit(rep(0.4,4),"lines"), 
      axis.title=element_blank()) 
}) 

Bây giờ chúng tôi sẽ bố trí sáu ô vào thời gian trong tệp PDF. Dưới đây là hai tùy chọn, một với bốn tệp PDF riêng biệt, mỗi tệp có sáu ô, một tệp khác với một tệp PDF bốn trang. Tôi cũng đã dán vào một trong các ô ở phía dưới. Chúng tôi sử dụng grid.arrange để bố trí các ô, bao gồm việc sử dụng các đối số leftbottom để thêm tiêu đề trục.

library(gridExtra) 

# Four separate single-page PDF files, each with six plots 
for (i in seq(1, length(plist), 6)) { 
    pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
    dev.off() 
} 

# Four pages of plots in one PDF file 
pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(plist), 6)) { 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
} 
dev.off() 
+0

Hi @ eipi10! Điều đó làm việc tuyệt vời và dễ hiểu! Mặc dù tôi đang gặp một vấn đề. Có vẻ như mã không giống như một trong những cá nhân của tôi và tôi nhận được lỗi này. Nó dừng in sau khi nó truy cập vào danh sách cá nhân '= (grobs Lỗi trong gList (705-70773 = list (grobs = list (danh sách (x = 0.5, y = 0.5,: chỉ 'grobs' được phép trong "gList" ' Mọi trợ giúp sẽ tuyệt vời! – LearningTheMacros

+1

Có điều gì đó về dữ liệu cho cá nhân đó dẫn đến một âm mưu không được sản xuất? Nếu không có cốt truyện, thì đầu ra của mã cốt truyện sẽ không phải là một grob (đối tượng đồ họa). Ví dụ: tất cả dữ liệu bị thiếu cho cá nhân đó hay đại loại như vậy? Hãy thử tạo cốt truyện của bạn nhưng nguồn cấp dữ liệu ggplot một khung dữ liệu chỉ với dữ liệu cho một cá nhân và xem những gì sẽ xảy ra. Nhìn vào dữ liệu cho cá nhân đó và xem có điều gì khác biệt rõ ràng về nó hay không. – eipi10

+0

Cốt truyện được thực hiện khi tôi sử dụng gợi ý của HubertL, vì vậy tôi không biết. Dù bằng cách nào, tôi hiểu câu trả lời của bạn và nó sẽ giúp tôi trong tương lai. Cảm ơn bạn lần nữa! – LearningTheMacros

2

cái gì đó như:

by(indbill, indbill$individual, function (x){ 
    ggplot(x, aes(x = prey, y = weight), tab) + 
    geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
    theme(axis.ticks.x = element_blank(), 
     axis.text.x = element_text(size=rel(0.5)), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_blank()) + 
    xlab("") + ylab("") + 
    guides(color = guide_legend(ncol=2)) + 
    coord_radar() 
} 
Các vấn đề liên quan