2013-03-03 11 views
5

Ich möchte jede Spalte einer Matrix als Boxplot darstellen und dann die Ausreißer in jedem Boxplot als den Zeilennamen bezeichnen, zu dem sie in der Matrix gehören. Um ein Beispiel zu verwenden:Kennzeichnung von Ausreißern auf Boxplot in 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) 

Ich mag würde die Ausreißer in jeder Parzelle (in diesem Fall 30) als Zeilen Namen beschriften sie gehört, so dass in diesem Fall 30 gehört 7. zu rudern Gibt es eine einfache Weg, dies zu tun? Ich habe ähnliche Fragen zu dieser Frage gestellt, aber keine schien so zu funktionieren, wie ich es möchte.

+0

Leider gehen wir. – user1836894

Antwort

3

In dem gegebenen Beispiel ist es ein bisschen langweilig, weil sie alle die gleiche Zeile sind. aber hier ist der Code:

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) 

Dies nimmt die rownames die Werte gleich der „out“ -Liste haben (das heißt, die Ausreißer) im Ergebnis der boxplot. Boxplot ruft die Werte von boxplot.stats auf und gibt sie zurück. Schauen Sie sich auf:

str(bxpdat) 
+0

Wird dies nicht fälschlicherweise zu Ausreißern führen, wenn es zwei Boxplots mit unterschiedlichen Mitteln gibt, wenn es einen Datenpunkt gibt, der in einem einen Ausreißer darstellt und nicht in dem anderen? –

+0

Sie können gerne ein Beispiel veröffentlichen, das Ihre Bedenken darstellt. Ich sehe nur einen Boxplot in der geposteten Frage. –

4

@ Dwin-Lösung sehr gut für einen einzelnen boxplot funktioniert, aber für irgendetwas mit doppelten Werten fehlschlagen, wie das Dataset ich geschaffen habe:

#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) 

Auf diesem Datensatz, @ Dwin-Lösung gibt:

enter image description here

, das falsch, weil im vierten Beispiel ist es für die minimalen und maximalen nicht möglich t sein er dieselbe Reihe.

Diese Lösung ist monströs (und ich hoffe, dass es vereinfacht werden kann), aber effektiv.

#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

Oder Sie können einfach den Code aus this blog post laufen:

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) 

(die mehrere Ausreißer behandelt, die zu nahe beieinander liegen)

enter image description here

+0

, dass Code-Quelle ist nicht mehr gültig –

+1

Dank @DavidPell - Ich reparierte es zu verwenden: https://raw.githubusercontent.com/talgalili/R-code-snippets/master/boxplot.with.outlier.label.r –

0

@ Sebastian-c Dies ist eine leichte Modifikation von Dwin Lösung, die

mit mehr Allgemeinheit zu funktionieren scheinen
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 
) 
} 
4

Es gibt einen einfachen Weg. Beachten Sie, dass b in Boxplot in den folgenden Zeilen ein Großbuchstabe ist.

library(car) 

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