2013-09-27 156 views
9

Tôi đang thực hiện phân tích thăm dò dữ liệu của mình và cần vẽ đồ thị bằng nhiều ggplot. Số lượng đồ họa thực sự rất lớn (206 trạm), và tôi muốn vẽ chúng trong 1 cột so với 8 hàng trên mỗi trang trên rất nhiều trang cần thiết. Tôi biết các chức năng như viewport hoặc grid.arrange, nhưng tôi không quản lý để làm cho chúng hoạt động trong trường hợp này. Tôi đã nhận thấy rằng bố trí() cũng không par (mfrow = c (8,1)) không làm việc với ggplot, nhưng tôi gửi một phần của mã nơi tôi bị mắc kẹt dưới đây. Bất kì sự trợ giúp nào đều được đánh giá cao!Nhiều đồ thị trên nhiều trang bằng ggplot

pdf('test.pdf', width=21, height=27) 
par(mfrow=c(8,1)) 
for(i in levels(tab$Station)) 
{ 

print(ggplot(tab[tab$Station==i], aes(x=Date)) + 
    geom_line(aes(y=Tmin), col="blue", size=0.1) + 
    geom_line(aes(y=Tmax), col="red", size=0.1) + 
    geom_text(aes(x=as.Date('2010-01-01'), y=45), label=i) + 
    ylim(0, 45) + 
    scale_x_date(labels = date_format("%Y")) + 
    theme_bw() + 
    theme(
    plot.background = element_blank() 
    ,panel.grid.major = element_blank() 
    ,panel.grid.minor = element_blank() 
    ,panel.border = element_rect(color = 'black') 
    ,panel.background = element_blank() 

) 
) 

} 

dev.off() 
+3

Xin chào Jose, bạn có nghĩ đây là một ví dụ có thể tái tạo không? Điều đó thường có nghĩa là cung cấp dữ liệu đồ chơi để chúng tôi có thể lấy mã và chạy nó. Thông thường, mọi người sử dụng hàm 'data()' để làm điều này. Ví dụ 'dữ liệu (mtcars)' tải rằng 'mtcars' data.frame vào bộ nhớ. – Statwonk

+1

Câu trả lời của @baptiste có hoạt động không? –

+2

Tôi biết đó là một câu hỏi cũ - nhưng hãy thử sử dụng hàm facet_wrap_paginate trong gói ggforce. Xem trợ giúp tại đây https://cran.r-project.org/web/packages/ggforce/ggforce.pdf đó là cách tôi giải quyết vấn đề tương tự của mình. –

Trả lời

1

Bạn nên đơn giản hóa cốt truyện của mình kể từ khi bạn nhận được đúng thứ tự với một âm mưu đơn giản bạn chỉ thay thế nó bằng âm mưu phức tạp của bạn. ggplot2 dựa trên gói grid để bạn cần sử dụng gridExtra để sắp xếp ô của mình. Sau đó, bạn lặp qua, đối với mỗi 8 lô, bạn lưu trữ chúng trong một danh sách và bạn gọi grid.arrange qua nó, và bạn lặp lại này cho đến cuối lô của bạn ...

library(gridExtra) 
library(ggplot2) 
pdf('test.pdf', width=21, height=27) 
i = 1 
plot = list() 
for (n in unique(tab$Station)){ 
    ### process data for plotting here #### 
    plot[[i]] = ggplot(tab[tab$Station==n], aes(x=Date)) +... 
    if (i %% 8 == 0) { ## print 8 plots on a page 
    print (do.call(grid.arrange, plot)) 
    plot = list() # reset plot 
    i = 0 # reset index 
    } 
    i = i + 1 
} 
if (length(plot) != 0) { 
    print (do.call(grid.arrange, plot)) 
} 
dev.off() 
0

Thật không may, mfrow không hoạt động với ggplot2. Bạn phải sử dụng các phương pháp khác như this one hoặc this one hoặc sử dụng chức năng gốc plot.

lẽ bạn có thể sử dụng faceting để có được 8 lô vào một trang, sau đó liên kết thứ hai để đặt nó vào nhiều tài liệu ...

1

faceting có thể là cách để đi. Quyết định số lượng các ô nhỏ mà bạn muốn trên mỗi trang, sau đó lặp lại số lần yêu cầu, tạo ra một png hoặc một pdf khi bạn đi. Vì vậy, nếu bạn có 200 mục dữ liệu và bạn muốn 50 mỗi trang, trong các khía cạnh của 5 trên và 10 xuống, chỉ cần lặp qua 200/50 = 4 lần lặp. Thô, nhưng nên làm việc.

facets

library(ggplot2) 

ii <- 7 
nn <- 49 

mydf <- data.frame(date = rep(seq(as.Date('2013-03-01'), 
         by = 'day', length.out = ii), nn), 
        value = rep(runif(nn, 100, 200))) 

mydf$facet.variable <- rep(1:nn, each = ii) 

p <- ggplot(mydf, aes(x = date, y = value)) + 
    geom_line() + 
    facet_wrap(~ facet.variable, ncol = ii) 

print(p) 
8
library(plyr) 
library(gridExtra) 

p = ggplot(tab, aes(x=Date)) + 
     geom_line(aes(y=Tmin), col="blue", size=0.1) 

plots = dlply(tab , "Station", `%+%`, e1 = p) 
ml = do.call(marrangeGrob, c(plots, list(nrow=8, ncol=1))) 
ggsave("multipage.pdf", ml) 

chưa được kiểm tra.

+0

bạn có thể giải thích những gì bạn đã làm để tạo ra các đối tượng 'lô đất 'ở trên không? ''% +% '' Làm gì? – llewmills

+1

'% +%' ghi đè dữ liệu trong một ggplot – baptiste

+0

Tôi vẫn là một vành đai xanh lục vì vậy cần sự giúp đỡ từ đai đen thứ 4 Đan như chính bạn. Tôi cũng chỉ mới quen với việc sử dụng 'plyr' và' dplyr' thay vì gia đình 'apply'. Vì vậy, tôi đoán ở đây, nhưng điều này có nghĩa là bạn đã truyền đối tượng 'tab' được subsetted (subsetted by Station) vào ggplot' p', sử dụng hàm '% +%' để ghi đè lên vị trí đối số 'tab' được giữ trong bản gốc? Nếu thật tuyệt vời. – llewmills