Cách vẽ đa giác gọn gàng xung quanh các vùng phân tán trong ggplot2 [đã đóng]


32

Làm cách nào để thêm một đa giác gọn gàng xung quanh một nhóm điểm trên biểu đồ phân tán? Tôi đang sử dụng ggplot2 nhưng thất vọng với kết quả geom_polygon.

Bộ dữ liệu ở đằng kia , dưới dạng tệp văn bản được phân định bằng tab. Biểu đồ dưới đây cho thấy hai thước đo thái độ đối với sức khỏe và thất nghiệp ở một loạt các quốc gia:

phân tán với mật độ2d

Tôi muốn chuyển từ geom_density2dít ưa thích hơn nhưng theo kinh nghiệm chính xác hơn geom_polygon. Kết quả trên dữ liệu chưa được sắp xếp là không có ích:

nhập mô tả hình ảnh ở đây

Làm cách nào để tôi vẽ các đa giác 'gọn gàng' hoạt động như các đường viền xung quanh các giá trị yx tối thiểu? Tôi đã cố gắng sắp xếp dữ liệu vô ích.

Mã số:

print(fig2 <- ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
geom_point() + geom_density2d(alpha=.5) + labs(x = "Efficiency", y = "Mandate"))

Đối dtượng thu được với tệp CSV này .

Dung dịch:

Cảm ơn Wayne , Andy W và những người khác cho con trỏ của họ! Dữ liệu, mã và đồ thị đã được đăng lên GitHub . Kết quả trông như thế này:

kết quả


6
Thuật ngữ bạn có thể đang tìm kiếm là vỏ lồi của các điểm (hoặc có khả năng là vỏ alpha). Bạn sẽ có thể tìm thấy một hàm R để tính toán các hàm này và sau đó có thể thêm chúng dưới dạng các lớp vào cốt truyện.
Andy W

Cảm ơn đã chỉ ra thuật ngữ chính xác! Tôi đã thất bại trong việc sử dụng ?chullvới ggplot2cho đến nay. Tôi không chắc chắn rằng tôi đang mã hóa nó đúng, và hy vọng rằng ai đó đã thực hiện nó.
Cha

Bạn có thể thêm mã R của bạn để đặt câu hỏi?
Yuriy Petrovskiy

Một điều cần lưu ý: những gì bạn đang hiển thị là cực đại, có thể là "ngoại lệ". Tôi tin rằng gói R alphahullhoạt động tương tự như tìm vỏ tàu lồi, nhưng cho phép bạn điều chỉnh nó vào trong / ra ngoài để cố gắng làm một cái gì đó như khoảng tin cậy.
Wayne

@Wayne, vỏ tàu alpha không phải là khoảng tin cậy (theo bất kỳ cách nào có thể tưởng tượng được). Xem câu hỏi gis.se này để biết mô tả ngắn gọn và một số tài liệu tham khảo về thân tàu alpha là gì. Có lẽ suy nghĩ của bạn về các hình elip tự tin bivariate, hoặc thậm chí có thể là bagplots (boxplots bi-variated để xác định các ngoại lệ).
Andy W

Câu trả lời:


33

Với một số người tôi đã tìm thấy trang web của Gota Morota, người có một ví dụ về việc này đã có trên trang web của cô ấy . Dưới đây là ví dụ mở rộng cho dữ liệu của bạn.

nhập mô tả hình ảnh ở đây

library(ggplot2)
work <- "E:\\Forum_Post_Stuff\\convex_hull_ggplot2"
setwd(work)

#note you have some missing data
mydata <- read.table(file = "emD71JT5.txt",header = TRUE, fill = TRUE)
nomissing <- na.omit(mydata) #chull function does not work with missing data

#getting the convex hull of each unique point set
df <- nomissing
find_hull <- function(df) df[chull(df$eff, df$man), ]
hulls <- ddply(df, "issue", find_hull)

plot <- ggplot(data = nomissing, aes(x = eff, y = man, colour=issue, fill = issue)) +
geom_point() + 
geom_polygon(data = hulls, alpha = 0.5) +
labs(x = "Efficiency", y = "Mandate")
plot

Cảm ơn, tôi sẽ sửa lại mã cho phù hợp. Thật không may, tập tin hình ảnh của bạn dường như không tải ở đây, nhưng mã ở đó.
Cha

@Fr. , Chính xác thì vấn đề là gì?
Andy W

@AndyW Thật không may, mã không hỗ trợ các giá trị bị thiếu và tôi không tìm thấy cách nào để điều chỉnh nó để làm như vậy.
Cha

@Fr., Làm thế nào chính xác bạn muốn xử lý các giá trị dữ liệu bị thiếu bên cạnh việc loại bỏ các quan sát đó? Bất kỳ kỹ thuật cắt cụt hợp lý nào cũng sẽ dẫn đến các điểm nằm trong vỏ lồi của các quan sát không bị thiếu.
Andy W

@AndyW Ý tôi là hàm NAkill chull. Tôi hy vọng nó sẽ bỏ qua nó, nhưng nó thất bại trong việc đó và tôi đã không tìm ra cách sử dụng na.omit()để làm cho nó hoạt động. Tôi chắc chắn là có thể, tôi chỉ không có kỹ năng hack để vượt ra ngoài giải pháp trước đó.
Cha

8

Nếu tôi hiểu vấn đề của bạn, bạn đang tìm kiếm thân tàu lồi healthvà của unemployment. Có lẽ có một số gói để làm điều này trong R, một trong số đó là gói geometry. Tôi tưởng tượng rằng các điểm được sắp xếp theo thứ tự xung quanh chu vi, nhưng bạn phải kiểm tra xem.

EDIT: Đây là một ví dụ, không sử dụng ggplot, nhưng tôi hy vọng nó hữu ích. Ví dụ trong chulltài liệu dường như sai, có thể khiến bạn thất vọng:

X <- matrix(rnorm(2000), ncol = 2)
X.chull <- chull (X)
X.chull <- c(X.chull, X.chull[1])
plot (X)
lines (X[X.chull,])

EDIT 2: OK, đây là một cái gì đó sử dụng ggplot2. Chúng tôi biến Xthành một data.framevới các biến xy. Sau đó:

library(ggplot2)
X <- as.data.frame(X)
hull <- chull(X)
hull <- c(hull, hull[1])
ggplot(X, aes(x=x, y=y)) + geom_polygon(data=X[hull,], fill="red") + geom_point()

Lưu ý rằng việc geom_pointsử dụng dữ liệu ( X) và aes từ ggplot, trong khi tôi ghi đè lên nó geom_polygon.

Để có được nó đầy đủ, bạn cần đặt x và y cho thân tàu cho cả hai vấn đề bar, sử dụng cột thứ ba issueđể phân biệt chúng.


Đúng về thân tàu lồi. Tôi đã cố gắng sử dụng chullđể tạo vỏ tàu lồi nhưng không thể sử dụng kết quả với ggplot2.
Cha

@Fr.: Tôi đã thực hiện một chỉnh sửa nhanh chóng câu trả lời của tôi. Xem nếu điều đó đưa bạn đi đúng hướng.
Wayne

Tôi có thể thấy nó hoạt động như thế nào, nhưng tôi tự hỏi làm thế nào để có được dòng cuối cùng với ggplot2.
Cha

@Fr.: OK, làm thế nào bây giờ?
Wayne

Nó đã làm việc! Cảm ơn. Tôi đã phải thêm na.omitđể thoát khỏi NA mà ngừng hoạt chullđộng. Cảm ơn một lần nữa.
Cha

5

Kể từ chiều nay, tôi đã gói chullchức năng bên trong gói R là một geom_convexhullchức năng.

Khi gói được tải, nó có thể được sử dụng như bất kỳ geom nào khác, trong trường hợp của bạn, nó sẽ giống như:

ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
  geom_convexhull(alpha=.5) + 
  geom_point() + 
  labs(x = "Efficiency", y = "Mandate"))

Gói có sẵn trên github: https://github.com/cmartin/ggConvexHull


Cảm ơn rất nhiều vì chuyện này! Tôi đã nhận được sự thất vọng từ đầu ra không mong muốn khi cố gắng áp dụng chullmột yếu tố nhóm cho đến khi tôi tìm thấy điều này.
chạy bộ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.