2013-05-07 34 views
7

Tôi tìm thấy một ví dụ tốt đẹp của âm mưu hình dạng thân lồi sử dụng ggplot với ddply đây: Drawing outlines around multiple geom_point groups with ggplotlồi thân ggplot sử dụng data.tables trong R

tôi nghĩ rằng tôi muốn thử một cái gì đó tương tự - tạo một cái gì đó giống như một Sơ đồ Ashby thực hành --Để với gói data.table:

test<-function() 
{ 
library(data.table) 
library(ggplot2) 

set.seed(1) 

Ở đây tôi định nghĩa một bảng đơn giản:

dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level") 

Và sau đó tôi xác định các vị trí thân tàu theo cấp:

hulls<-dt[,as.integer(chull(.SD)),by=level] 
setnames(hulls,"V1","hcol") 

Vì vậy, sau đó suy nghĩ của tôi là sáp nhập thân với dt, vì vậy mà tôi cuối cùng có thể thao tác thân để có được trong các hình thức thích hợp cho ggplot (hình dưới đây để tham khảo):

ashby<-ggplot(dt,aes(x=xdata,y=ydata,color=level))+ 
     geom_point()+ 
     geom_line()+ 
     geom_polygon(data=hulls,aes(fill=level)) 
} 

Nhưng có vẻ như bất kỳ cách nào tôi cố gắng hợp nhất vỏ và dt, tôi gặp lỗi. Ví dụ: hợp nhất (hulls, dt) tạo ra lỗi như được hiển thị trong chú thích 1.

Điều này có vẻ như nó phải đơn giản, và tôi chắc chắn rằng tôi chỉ thiếu một cái gì đó hiển nhiên. Bất kỳ hướng nào đến một bài viết hoặc suy nghĩ tương tự về cách chuẩn bị vỏ cho ggplot được đánh giá cao. Hoặc nếu bạn nghĩ rằng tốt nhất là nên tuân theo cách tiếp cận ddply, vui lòng cho tôi biết.

Ví dụ đầu ra không mong muốn:

test<-function(){ 
    library(data.table) 
    library(ggplot2) 
    dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level") 
    set.seed(1) 
    hulls<-dt[,as.integer(chull(.SD)),by=level] 
    setnames(hulls,"V1","hcol") 
    setkey(dt, 'level') #setting the key seems unneeded 
    setkey(hulls, 'level') 
    hulls<-hulls[dt, allow.cartesian = TRUE] 
    ggplot(dt,aes(x=xdata,y=ydata,color=level))+ 
      geom_point()+ 
      geom_polygon(data=hulls,aes(fill=level)) 
} 

kết quả trong một mớ hỗn độn của đa giác lan truyền chéo: undesired output

Footnote 1: Lỗi trong vecseq (f__, len__, if (cho phép .cartesian) NULL khác as.integer (max (nrow (x),: Tham gia kết quả trong 60 hàng, nhiều hơn 15 = max (nrow (x), nrow (i)). Kiểm tra các giá trị khóa trùng lặp trong i, mỗi trong đó tham gia vào cùng nhóm trong x hơn và hơn nữa. Nếu đó là ok, hãy thử bao gồm j và thả by (by-without-by) để j chạy cho mỗi nhóm để tránh phân bổ lớn. Nếu bạn chắc chắn muốn tiếp tục, hãy chạy lại với allow.cartesian = TRUE. Nếu không, vui lòng tìm kiếm thông báo lỗi này trong FAQ, Wiki, Stack Overflow và datatable-help để được tư vấn.

+0

Và tôi đoán có một cách thanh lịch để thực hiện việc này. Với khả năng này, tôi nghĩ rằng phương pháp này có thể dễ dàng mở rộng để tạo ra những âm mưu giống như Ashby. Ví dụ: http://commons.wikimedia.org/wiki/File:Ashby_plot_big.jpg – Docuemada

+2

+1 để thể hiện nỗ lực của bạn và giải thích rõ ràng những gì bạn muốn. Xin lưu ý rằng việc gọi 'thư viện' trong chức năng của riêng bạn có thể là không cần thiết (và không hiệu quả nếu bạn dự định gọi hàm này nhiều lần). –

Trả lời

8

Dưới đây là những gì bạn muốn làm.Tạo một số dữ liệu ngẫu nhiên:

library(ggplot2) 
library(data.table) 
# You have to set the seed _before_ you generate random data, not after 
set.seed(1) 
dt <- data.table(xdata=runif(15), ydata=runif(15), level=rep(c("a","b","c"), each=5), 
    key="level") 

Đây là nơi sự kỳ diệu xảy ra:

hulls <- dt[, .SD[chull(xdata, ydata)], by = level] 

Vẽ các kết quả:

ggplot(dt,aes(x=xdata,y=ydata,color=level)) + 
    geom_point() + 
    geom_polygon(data = hulls,aes(fill=level,alpha = 0.5)) 

sản xuất

enter image description here

tôi t hoạt động vì chull trả về một vectơ các chỉ mục cần được chọn từ dữ liệu để tạo thành một lồi lồi. Sau đó, chúng tôi sẽ đặt từng khung dữ liệu riêng lẻ với .SD[...]data.table kết hợp chúng với nhau theo level.

+0

allow.cartesian là một mẹo mà tôi không biết, cảm ơn bạn. Như trong ví dụ của bạn, vấn đề tôi đang gặp là giữ thông tin về mức độ. Tác giả của câu hỏi: http://stackoverflow.com/questions/14419493/drawing-outlines-around-multiple-geom-point-groups-with-ggplot có thể tạo ra các hình dạng thân lồi xung quanh nhiều nhóm bằng cách sử dụng ddply. Tôi chủ yếu cố gắng lặp lại đầu ra của câu hỏi ban đầu của tác giả bằng cách sử dụng phương pháp data.table. – Docuemada

+0

Bạn có thể làm rõ ý của bạn bằng cách 'giữ thông tin về mức độ' không? Như trong, với 'hulls' và' dt' như trên, bạn muốn đầu ra là gì? –

+0

vỏ [dt, allow.cartesian = TRUE] trả về dữ liệu.table của 60 hàng. Tuy nhiên, đối với ba thân "a", "b" và "c", tôi không cần 60 điểm để mô tả các hình dạng, vì một số điểm nằm bên trong hình dạng. Tôi sẽ đưa ra một ví dụ đầu ra không mong muốn trong câu hỏi của tôi để giúp minh họa. 1 cho allow.cartesian bằng cách này. – Docuemada

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