2011-10-15 27 views
7

Thay vì hỏi cách vẽ các tập dữ liệu lớn, tôi muốn bọc plot sao cho mã tạo ra nhiều ô không bị đóng búa khi nó vẽ đồ vật lớn. Làm thế nào tôi có thể bọc plot với một cách rất đơn giản để tất cả các chức năng của nó được bảo quản, nhưng các thử nghiệm đầu tiên để xác định có hay không các đối tượng được thông qua là quá lớn?Chức năng cốt truyện của R (hoặc ggplot2) để ngăn việc vẽ các tập dữ liệu lớn

Mã này hoạt động cho các cuộc gọi rất vani tới plot, nhưng thiếu tính tổng quát giống như plot (xem bên dưới).

myPlot <- function(x, ...){ 
    isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) || (nrow(x) > 10^6)) 
    if(is.na(isBad)){isBad = FALSE} 
    if(isBad){ 
     stop("No plots for you!") 
    } 
    return(plot(x, ...)) 
} 

x = rnorm(1000) 
x = rnorm(10^6 + 1) 

myPlot(x) 

Một ví dụ nơi này không thành công:

x = rnorm(1000) 
y = rnorm(1000) 
plot(y ~ x) 
myPlot(y ~ x) 

Có một số cách dễ dàng để quấn plot để cho phép kiểm tra này của dữ liệu được vẽ, trong khi vẫn đi qua tất cả các đối số? Nếu không, thì làm thế nào về ggplot2? Tôi là một cơ hội bình đẳng không phải là người vẽ. (Trong trường hợp các tập dữ liệu lớn, tôi sẽ sử dụng hexbin, phụ mẫu, lô mật độ, vv, nhưng đó không phải là tập trung ở đây.)


Lưu ý 1: Khi thử nghiệm những ý tưởng, tôi khuyên bạn nên thử nghiệm cho kích thước> 100 (hoặc đặt một biến, ví dụ: myThreshold <- 1000), thay vì so với kích thước> 1 triệu - nếu không sẽ có rất nhiều nỗi đau khi chạm vào âm mưu chậm. :)

Trả lời

6

Vấn đề bạn có là hiện tại được mã hóa, myplot() giả định x là một đối tượng dữ liệu, nhưng sau đó bạn cố chuyển nó thành công thức. R's plot() đạt được điều này thông qua các phương thức - khi x là công thức, phương thức plot.formula() được gửi đến thay vì phương thức cơ bản plot.default().

Bạn cần phải làm như vậy:

myplot <- function(x, ...) 
    UseMethod("myplot") 

myplot.default <- function(x, ....) { 
    isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) || 
        (nrow(x) > 10^6)) 
    if(is.na(isBad)){isBad = FALSE} 
    if(isBad){ 
     stop("No plots for you!") 
    } 
    invisible(plot(x, ...)) 
} 

myplot.formula <- function(x, ...) { 
    ## code here to process the formula into a data object for plotting 
    .... 
    myplot.default(processed_x, ...) 
} 

Bạn có thể ăn cắp mã từ plot.formula() để sử dụng trong mã cần thiết để xử lý x vào một đối tượng. Ngoài ra, bạn có thể cuộn của riêng bạn theo sau standard non-standard evaluation rules (PDF).

+0

+1 để đăng câu trả lời đúng. – Andrie

+0

+1 Để biết thông tin chi tiết về những gì đang xảy ra và cho con trỏ rất hữu ích đối với tham chiếu chuẩn không chuẩn. Bạn có thể làm rõ nơi tôi có thể tìm thấy mã cho 'plot.formula'? Tôi cho rằng bất kỳ mã nào trích xuất các đối tượng từ một công thức sẽ hoạt động, vì vậy tôi cũng đang tìm kiếm. – Iterator

+1

@Iterator 'graphics ::: plot.formula' hoặc' getAnywhere (plot.formula) 'sẽ hiển thị mã. 'phương thức (cốt truyện)' sẽ hiển thị những phương thức S3 có sẵn cho cốt truyện chung. Lưu ý rằng 'plot.formula' được hiển thị với một' * 'trong đầu ra từ' methods() ', chỉ ra rằng chính hàm đó không được xuất khẩu từ không gian tên; thay vào đó nó được đăng ký như một phương thức S3 để gửi đi. –

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