2011-10-28 17 views
5

Chcę narysować boxplots w R i dodać nazwy do wartości odstających. Do tej pory znalazłem this solution.Etykietowanie odstające na zewnątrz w R

Ta funkcja zapewnia wszystkie funkcje, których potrzebuję, ale niepoprawnie indeksuje etykiety. W poniższym przykładzie, to oznacza odrębne stanowisko jako „u” zamiast „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) 

Czy znasz rozwiązanie? Biblioteka ggplot2 jest bardzo ładna, ale nie zapewnia takiej funkcjonalności (o ile wiem). Moją alternatywą jest użycie funkcji text() i wyodrębnienie informacji odstających z obiektu boxplot. Jednak etykiety mogą się nakładać.

dziękuję :-)

+2

Aktualizacja: Przyniosłem ten błąd na baczność Tal Galili, a w/w ciągu kilku godzin opublikował edytowaną wersję skryptu, który nie wykazuje już tego problemu. –

Odpowiedz

6

Wziąłem spojrzeć na to z debug(boxplot.with.outlier.label) i ... okazuje się, że to bug w funkcji.

Błąd występuje na linii 125, gdzie data.frame DATA jest wykonana z x, y i label_name.

Poprzednio x i y zostały zmienione, a lab_y nie było. Kiedy dostarczona wartość x (Twój x1) nie jest już w porządku, dostaniesz tego rodzaju doznanie, którego doświadczyłeś.

Jako natychmiastowej poprawki można pre-order wartości x tak (lub coś bardziej eleganckie)

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: dziękuję.^_^ –

+0

Dzięki Josh. Wpadłem na ten sam problem kilka dni temu, więc to była świetna pomoc +1 – pssguy

+1

Cieszę się, że mogę Ci pomóc.Ponieważ wygląda to na użytek innych osób, właśnie wysłałem e-maila do autora skryptu, tak jak prosił użytkowników, aby znaleźli błędy w skrypcie. –

1

intelligent point label placement jest odrębnym zagadnieniem omawianym here lub here. Nie ma żadnego ostatecznego i idealnego rozwiązania, więc musisz wybrać tylko jedno.

Więc byś overplot normalny wykres typu boxplot z etykietami w następujący sposób:

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) 

Następnie podczas identify() działa, wystarczy kliknąć na pozycję, w której chcesz etykiecie jak opisano here. Po zakończeniu naciśnij "STOP". Należy pamiętać, że każdy odstający może mieć więcej niż jedną etykietę! W moim rozwiązaniu po prostu wybrałem pierwszy !!

PS: Wstydzę się pętli for, ale nie wiem, jak ją wektoryzować - zachęcamy do poprawy.

EDYCJA: zainspirowany przez Federico's link teraz widzę, że można to zrobić o wiele łatwiej! Tylko te 2 komendy:

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

Rozwiązanie identyfikacji() jest ładne, ale nie jest skalowalne, mam setki działek i muszę je wydrukować jako pliki PDF :-) –

Powiązane problemy