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:
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.
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
+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). –