2012-07-06 61 views
14

Tôi đang viết mã R cho phép người dùng chọn cột từ dữ liệu và biểu đồ lô cho mỗi ô. Do đó, tôi đang sử dụng vòng lặp 'for' để tạo số lượng ô yêu cầu bằng cách sử dụng thư viện ggplot2 và lưu chúng trong một danh sách duy nhất. Nhưng vấn đề tôi phải đối mặt là, tại mỗi lần lặp của vòng lặp for ', tất cả các đối tượng trong danh sách đều lưu trữ cùng một cốt truyện. Do đó, kết quả cuối cùng bao gồm một mạng lưới các biểu đồ, được gắn nhãn khác nhau nhưng mô tả cùng một cột (cuối cùng).R: lưu các ô ggplot2 trong một danh sách

Tôi hiểu rằng câu hỏi này khá cũ và tôi đã tìm thấy câu trả lời trên renaming ggplot2 graphs in a for loophttps://stat.ethz.ch/pipermail/r-help/2008-February/154438.html làm điểm bắt đầu hữu ích.

Tôi đã sử dụng tập dữ liệu Swiss Fertility chuẩn có sẵn trong R để tạo các ô. Đây là mã: -

data_ <- swiss 
data_ <- na.omit(data_) 

u <- c(2, 3, 4, 5, 6) 
plotData <- data_[,u] 
bw <- 5 
plotType <- 'probability' 

library(ggplot2) 
library(gridExtra) 

histogramList <- vector('list', length(u)) 

if(plotType=='probability') 
{ 
for(i in 1:length(u)) 
{ 
    indexDataFrame <- data.frame(plotData[,i]) 
    probabilityHistogram <- ggplot(indexDataFrame, aes(x=indexDataFrame[,1])) 
    histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..density..),  binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none') 
} 
} else 
if(plotType=='frequency') 
{ 
for(i in 1:length(u)) 
{ 
    indexDataFrame <- data.frame(plotData[,i]) 
    probabilityHistogram <- ggplot(indexDataFrame, aes(x=indexDataFrame[,1])) 
    histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..count..), binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none') 
} 
} 

arg_list <- c(histogramList, list(nrow=3, ncol=2)) 
#jpeg('histogram', width=1024, height=968) 
do.call(grid.arrange, arg_list) 
#graphics.off() 

Tôi xin lỗi nếu tôi đã bỏ lỡ câu trả lời rõ ràng cho câu hỏi trong diễn đàn này và sẽ biết ơn nếu bạn có thể hướng dẫn tôi về vấn đề này. Tôi hy vọng lời giải thích của tôi là rõ ràng và nếu không, xin vui lòng cho tôi biết về các giải thích cần thiết.

Cảm ơn!

Trả lời

5

Thay vì thẩm mỹ lập bản đồ sử dụng aes, bạn có thể được tốt hơn bằng cách sử dụng aes_string:

for(i in 1:length(u)) 
{ 
    probabilityHistogram <- ggplot(plotData, aes_string(x=names(plotData)[i])) 
    histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..density..),  binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none') 
} 

Đó làm việc cho tôi, ít nhất. Điều này tránh phải tập hợp dữ liệu của bạn và cho phép bạn tham chiếu cột bạn muốn vẽ theo tên được trích dẫn.

+0

cũng làm việc cho tôi. cảm ơn! –

16

Bạn bao la có thể đơn giản hóa mã của bạn bằng:

  1. Sử dụng khía cạnh, chứ không phải bằng tay sắp xếp nhiều lô
  2. Melting dữ liệu của bạn với chức năng melt trong gói reshape2
  3. Điều này có nghĩa bạn có thể loại bỏ các vòng lặp

Dưới đây là viết lại hoàn toàn mã của bạn, không có vòng lặp nào trong tầm nhìn.

data_ <- swiss 
data_ <- na.omit(data_) 

u <- c(2, 3, 4, 5, 6) 
plotData <- data_[,u] 
bw <- 5 
plotType <- 'frequency' 

library(ggplot2) 
library(reshape2) 

mdat <- melt(plotData) 

if(plotType=='probability'){ 
    ph <- ggplot(mdat, aes(value)) + 
    geom_histogram(aes(y=..density..), binwidth=bw, colour='black', fill='skyblue') + 
    geom_density() + 
    facet_wrap(~variable, scales="free") 
} 

if(plotType=='frequency'){ 
    ph <- ggplot(mdat, aes(value)) + 
    geom_histogram(aes(y=..count..), binwidth=bw, colour='black', fill='skyblue') + 
    geom_density() + 
    facet_wrap(~variable, scales="free") 
} 

print(ph) 

Các đồ họa kết quả:

Xác suất:

enter image description here

Tần

enter image description here

+0

điều này có vẻ tuyệt vời! cảm ơn! –

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