2012-02-02 43 views
11

Tôi phải tạo 250 ô với cùng một giao diện.Tạo các ô trong vòng lặp bằng ggplot2

dụ Dữ liệu của tôi thiết lập:

df <- data.frame(name = c("john","alex","mike","dennis","alex"), 
      expenses = c("10","12","15","8","2"), 
      type = c("food","rent","rent","food","food")) 

Tôi muốn lô quầy bar với các khoản chi phí cho mỗi tên trong một âm mưu duy nhất. Cốt truyện cho "alex" sẽ trông giống như:

selected.name <- "alex" 
df1 <- subset(df, name == selected.name) 
ggplot(data = df1, aes(type, expenses)) + geom_bar() 

Bây giờ tôi muốn sử dụng vòng lặp vẽ lô đất giống nhau cho mỗi tên trong df. Tôi đã cố gắng sử dụng một vòng lặp for chạy mã cốt truyện ở trên dưới dạng tệp nguồn. Nhưng tôi không thể chuyển biến tên vào tệp nguồn để nó vẽ đồ thị cho mỗi tên. Bây giờ tôi chỉ nhận được một đồ thị trong vòng lặp for.

+0

vui lòng nêu rõ câu hỏi của bạn thêm một chút. là vấn đề của bạn mà bạn chỉ nhận được 1 cửa sổ với 1 đồ thị? hơn 'x11()' có thể là giải pháp. nếu bạn muốn lưu các tệp pdf, sau đó sử dụng 'pdf (file)' 'print (ggplot (...)' 'dev.off()' .... – Seb

+0

Xin chào Seb, cảm ơn bạn đã trả lời. Tôi muốn tạo một cốt truyện như cốt truyện tôi tạo ra cho tên alex cho mỗi tên khác trong df.Không cần phải tự nhập tên, bởi vì trong các dữ liệu thực có 250 tên.Điều này hy vọng sẽ giúp – jeroen81

+1

@ Seb, tôi sẽ đi cho ggsave thay vì pdf() –

Trả lời

15

Để trả lời câu hỏi orignal của bạn. Để thực hiện điều này bằng tiêu chuẩn R:

doPlot = function(sel_name) { 
    dum = subset(df, name == sel_name) 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 

Bằng cách này bạn kết thúc với một số lượng lớn các tập tin pdf gọi Adam.pdf vv Bạn sau đó có thể sử dụng pdftk (pdf bộ công cụ) để mèo các tập tin với nhau trong một tài liệu. Tôi vẫn thích, một giải pháp tốt hơn bằng cách sử dụng ví dụ: facetting hoặc một loại khác nhau của cốt truyện.

Sẽ không tốt hơn nhiều khi sử dụng tính năng vuốt? Với ví dụ của bạn mã sẽ là:

ggplot(data = df, aes(type, expenses)) + 
    geom_bar() + facet_wrap(~name) 

dẫn đến cốt truyện sau:

enter image description here

lẽ cho 250 tên và biến hơn, điều này có thể là một vấn đề. Nhưng tôi vẫn nhìn vào mặt.

+0

Cảm ơn Paul, đây là một tính năng tốt đẹp, nó rất tiện lợi để so sánh các ô. 250 tên và 12 biến chi phí.Điều này sẽ tạo ra một âm mưu rất phức tạp.Tôi đang xây dựng một công cụ báo cáo tạo ra tất cả các loại KPIs cho mỗi nhân viên Và chúng tôi không so sánh trong báo cáo này. Báo cáo được tạo bằng latex/R sweave – jeroen81

+1

Tôi đã thêm một giải pháp với các ô riêng lẻ trong pdf riêng biệt tập tin vào câu trả lời của tôi. –

+0

Cảm ơn Paul, điều này làm việc hoàn hảo cho tôi ngay bây giờ. Tôi có thể tuân thủ các chức năng hơn nữa theo nhu cầu của tôi. – jeroen81

1

Một đồng nghiệp chỉ ra rằng việc sử dụng tập hợp con trong một hàm là một ý tưởng rất tồi. Xem ?subset() để biết thêm thông tin. Vì vậy, tôi thích nghi với anwser của Paul Hiemstra và thay thế các tập hợp con.

doPlot = function(sel_name) { 
    dum <- df[df$name == sel_name,] 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 
+0

+1! Điểm tuyệt vời. Subset shoul – marbel

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