2011-10-28 37 views
5

Tôi muốn vẽ ô trong R và thêm tên vào các ngoại lệ. Cho đến nay tôi đã tìm thấy this solution.Ghi nhãn ngoại lệ hộp trong R

Chức năng ở đó cung cấp tất cả chức năng tôi cần, nhưng nó xáo trộn các nhãn không chính xác. Trong ví dụ sau, nó đánh dấu ngoại lệ là "u" thay vì "o":

library(plyr) 
library(TeachingDemos) 
source("http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt") # Load the function 
set.seed(1500) 
y <- rnorm(20) 
x1 <- sample(letters[1:2], 20,T) 
lab_y <- sample(letters, 20) 
# plot a boxplot with interactions: 
boxplot.with.outlier.label(y~x1, lab_y) 

Bạn có biết giải pháp nào không? Thư viện ggplot2 siêu đẹp, nhưng không cung cấp chức năng như vậy (theo như tôi biết). Cách khác của tôi là sử dụng hàm text() và trích xuất thông tin ngoại lệ từ đối tượng boxplot. Tuy nhiên, như thế này các nhãn có thể chồng lên nhau.

Thanks a lot :-)

+2

Cập nhật: Tôi đưa lỗi này đến sự chú ý Tal Galili, và w/trong vài giờ, anh ấy đã đăng phiên bản đã chỉnh sửa của tập lệnh không còn hiển thị vấn đề này nữa. –

Trả lời

6

tôi đã xem xét điều này với debug(boxplot.with.outlier.label), và ... nó quay ra có một bug trong hàm.

Lỗi xảy ra trên dòng 125, trong đó data.frame DATA được tạo từ x, ylabel_name.

Trước đây xy đã được sắp xếp lại, trong khi lab_y chưa từng có. Khi giá trị được cung cấp của x (của bạn x1) không phải là chính nó đã được theo thứ tự, bạn sẽ nhận được các loại jumbling bạn có kinh nghiệm.

Như khắc phục ngay, bạn có thể đặt hàng trước các giá trị x như thế này (hoặc làm điều gì đó tao nhã hơn)

df <- data.frame(y, x1, lab_y, stringsAsFactors=FALSE) 
df <- df[order(df$x1), ] 
# Needed since lab_y is not searched for in data (though it probably should be) 
lab_y <- df$lab_y 

boxplot.with.outlier.label(y~x1, lab_y, data=df) 

Boxplot produced by procedure described above

+0

Josh: cảm ơn bạn.^_^ –

+0

Cảm ơn Josh. Tôi đã gặp phải vấn đề tương tự vài ngày trước vì vậy đây là một trợ giúp tuyệt vời +1 – pssguy

+1

Rất vui được trợ giúp.Vì có vẻ như nó được sử dụng cho một số người khác, tôi vừa gửi email cho tác giả của kịch bản, vì anh ấy đã yêu cầu người dùng làm gì nếu họ tìm thấy lỗi trong tập lệnh. –

1

Các intelligent point label placement là một vấn đề riêng biệt thảo luận here hoặc here. Không có giải pháp tối ưu và lý tưởng để bạn chỉ cần chọn một giải pháp ở đó.

Vì vậy, bạn sẽ overplot các boxplot bình thường với nhãn, như sau:

set.seed(1501) 
y <- c(4, 0, 7, -5, rnorm(16)) 
x1 <- c("a", "a", "b", "b", sample(letters[1:2], 16, T)) 
lab_y <- sample(letters, 20) 

bx <- boxplot(y~x1) 

out_lab <- c() 
for (i in seq(bx$out)) { 
    out_lab[i] <- lab_y[which(y == bx$out[i])[1]] 
} 

identify(bx$group, bx$out, labels = out_lab, cex = 0.7) 

Sau đó, trong quá trình identify() đang chạy, bạn chỉ cần nhấp vào vị trí nơi bạn muốn nhãn, như mô tả here. Khi hoàn tất, bạn chỉ cần nhấn "STOP". Lưu ý rằng mỗi ngoại lệ có thể có nhiều hơn một nhãn! Trong giải pháp của tôi, tôi chỉ đơn giản là chọn đầu tiên !!

PS: Tôi cảm thấy xấu hổ vì vòng lặp for, nhưng không biết cách vector hóa nó - cảm thấy tự do để cải thiện bài đăng.

CHỈNH SỬA: lấy cảm hứng từ Federico's link bây giờ tôi thấy nó có thể được thực hiện dễ dàng hơn nhiều! Chỉ cần những 2 lệnh:

boxplot(y~x1) 
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7) 
+1

Giải pháp ident() là tốt, nhưng nó không thể mở rộng, tôi có hàng trăm ô và tôi phải in chúng dưới dạng PDF :-) –

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