2 cevap

debug (boxplot.with.outlier.label) ile buna bir göz attım ve işlevde bug var.

Hata DATA x , y ve label_name öğelerinden oluşturulduğu satırda 125 oluşur.

Önceden lab_y olmasa da x ve y yeniden düzenlenmiştir. x öğesinin verilen değeri ( x1 ) zaten sıralı değilse, deneyimlediğiniz türden bir eşleşme elde edersiniz.

Hemen bir düzeltme olarak, x değerlerini bu gibi ön sipariş verebilir (veya daha zarif bir şey yapabilirsiniz)

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

6
katma
Sağol Josh. Birkaç gün önce aynı soruna girdim, bu yüzden bu harika bir yardımcı oldu +1
katma yazar pssguy, kaynak
Güncelleme: Bu soruyu soran Josh'a (ve işlevdeki hata noktasını tespit ederek) teşekkürler - Bu sorunu çözen güncellenmiş bir sürümü yükleyebildim. Sağol Josh. En iyi, Tal
katma yazar Tal Galili, kaynak
Yardım etmekten memnun oldum. Bu, diğer bazı insanlar için kullanıldığından göründüğü için, komut dosyasında bir hata bulmuşsa, kullanıcılardan istediği gibi komut dosyasının yazarına e-posta gönderdim.
katma yazar Josh O'Brien, kaynak
Josh: teşekkür ederim. ^ _ ^
katma yazar Federico Giorgi, kaynak

akıllı nokta etiket yerleşimi , burada veya burada . Nihai ve ideal bir çözüm yok, bu yüzden sadece bir tane seçmeniz gerekiyor.

Böylece normal kutu işaretini aşağıdaki gibi etiketlerle üst üste koyarsınız:

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)

Ardından define() çalışması sırasında etiketin nerede olmasını istediğiniz yere tıklamanız yeterlidir. burada açıklandığı gibi. Bittiğinde, sadece "DUR" tuşuna basarsınız. Her bir aykırı değerin birden fazla etikete sahip olabileceğini unutmayın! Benim çözümümde, sadece ilkini seçtim!

Not: For döngüsünden utanıyorum, ama onu nasıl simüle edeceğini bilemiyorum - iyileştirme yapmaktan çekinmeyin.

EDIT: Federico'nın linki şimdi çok daha kolay yapılabilir görüyorum! Sadece şu 2 komut:

boxplot(y~x1)
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7)
1
katma
Define() çözümü güzel, ancak ölçeklenebilir değil, yüzlerce çizimim var ve bunları PDF'ler olarak yazdırmam gerekiyor :-)
katma yazar Federico Giorgi, kaynak