2013-03-03 35 views
5

Tôi muốn vẽ từng cột của ma trận làm ô mẫu và sau đó gắn nhãn các ngoại lệ trong mỗi ô mẫu làm tên hàng mà chúng thuộc về ma trận. Để sử dụng ví dụ:Ghi nhãn ngoại lệ trên ô mẫu trong R

vv=matrix(c(1,2,3,4,8,15,30),nrow=7,ncol=4,byrow=F) 
rownames(vv)=c("one","two","three","four","five","six","seven") 
boxplot(vv) 

Tôi muốn gắn nhãn cho ngoại lệ trong mỗi ô (trong trường hợp này là 30) làm tên hàng, trong trường hợp này 30 thuộc hàng 7. Có dễ dàng không cách để làm điều này? Tôi đã thấy những câu hỏi tương tự với câu hỏi này nhưng dường như không có cách nào tôi làm theo cách tôi muốn.

+0

Xin lỗi, chúng tôi đi. – user1836894

Trả lời

3

Trong ví dụ được cung cấp, nó hơi nhàm chán vì tất cả đều giống nhau. nhưng ở đây là mã:

bxpdat <- boxplot(vv) 
text(bxpdat$group,            # the x locations 
    bxpdat$out,            # the y values 
    rownames(vv)[which(vv == bxpdat$out, arr.ind=TRUE)[, 1]], # the labels 
    pos = 4) 

này picks rownames có giá trị tương đương với danh sách "out" (ví dụ, các giá trị ngoại biên) trong kết quả của boxplot. Boxplot gọi và trả về các giá trị từ boxplot.stats. Hãy xem tại địa chỉ:

str(bxpdat) 
+0

Sẽ không đánh dấu sai các ngoại lệ này nếu có hai ô với các phương tiện khác nhau nếu có một điểm dữ liệu là một ngoại lệ trong một và không phải là ngoại lệ? –

+0

Bạn được quyền đăng một ví dụ thể hiện mối quan tâm của bạn. Tôi chỉ thấy một ô trong câu hỏi được đăng. –

4

@ giải pháp DWin của hoạt động rất tốt cho một boxplot duy nhất, nhưng sẽ thất bại cho bất cứ điều gì với các giá trị trùng lặp, giống như bộ dữ liệu tôi đã tạo:

#Create data 
set.seed(1) 
basenums <- c(1,2,3,4,8,15,30) 
vv=matrix(c(basenums, sample(basenums), 1-basenums, 
      c(0, 29, 30, 31, 32, 33, 60)),nrow=7,ncol=4,byrow=F) 
dimnames(vv)=list(c("one","two","three","four","five","six","seven"), 1:4) 

Mở tập dữ liệu này, @ giải pháp DWin của cho:

enter image description here

đó là sai lầm, bởi vì trong ví dụ 4, nó không phải là có thể cho tối thiểu và tối đa là trong t anh ấy cùng hàng.

Giải pháp này thật kỳ quái (và tôi hy vọng có thể được đơn giản hóa), nhưng hiệu quả.

#Reshape data 
vv_dat <- as.data.frame(vv) 
vv_dat$row <- row.names(vv_dat) 
library(reshape2) 
new_vv <- melt(vv_dat, id.vars="row") 

#Get boxplot data 
bxpdat <- as.data.frame(boxplot(value~variable, data=new_vv)[c("out", "group")]) 

#Get matches with boxplot data 
text_guide <- do.call(rbind, apply(bxpdat, 1, 
    function(x) new_vv[new_vv$value==x[1]&new_vv$variable==x[2], ])) 

#Add labels 
with(text_guide, text(x=as.numeric(variable)+0.2, y=value, labels=row)) 

enter image description here

0

Hoặc bạn chỉ có thể chạy mã từ this blog post:

source("https://raw.githubusercontent.com/talgalili/R-code-snippets/master/boxplot.with.outlier.label.r") # Load the function 
set.seed(6484) 
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) 

(mà xử lý nhiều giá trị ngoại biên mà là gần nhau)

enter image description here

+0

nguồn mã đó không còn hợp lệ –

+1

Cảm ơn @DavidPell - Tôi đã sửa nó để sử dụng: https://raw.githubusercontent.com/talgalili/R-code-snippets/master/boxplot.with.outlier.label.r –

0

@ sebastian-c Đây là một sửa đổi nhỏ dung dịch DWin mà dường như làm việc với tính tổng quát hơn

bx1<-boxplot(pb,las=2,cex.axis=.8) 
if(length(bx1$out)!=0){ 
    ## get the row of each outlier 
    out.rows<-sapply(1:length(bx1$out),function(i) which(vv[,bx1$group[i]]==bx1$out[i])) 
    text(bx1$group,bx1$out, 
    rownames(vv)[out.rows], 
    pos=4 
) 
} 
5

Hoặc cách khác, bạn có thể sử dụng "Boxplot" chức năng từ {xe} gói các nhãn giá trị ngoại biên cho bạn.

Xem liên kết sau: http://www.inside-r.org/packages/cran/car/docs/Boxplot

Dễ dàng hơn nhiều!

+0

Liên kết mà không có ví dụ sử dụng không tạo thành câu trả lời; vui lòng cung cấp mã ví dụ – MichaelChirico

4

Có một cách đơn giản. Lưu ý rằng b trong Boxplot trong các dòng sau là một chữ cái viết hoa.

library(car) 

Boxplot(y ~ x, id.method="y")