Głównym problemem PO wydaje się, że jest to, że mają one bardzo ciężkie dane ogoniastych - i nie sądzę, większość obecnych odpowiedzi właściwie radzić sobie z tego problemu w ogóle , więc jestem promowanie mój poprzedni komentarz do odpowiedzi.
Jeśli chcesz pozostać przy boxplots, niektóre opcje są wymienione poniżej. Utworzyłem niektóre dane w R, które pokazują podstawowy problem:
set.seed(seed=7513870)
x <- rcauchy(80)
boxplot(x,horizontal=TRUE,boxwex=.7)
Środkowa połowa danych jest zmniejszona do małego paska o szerokości kilku mm. Ten sam problem dotyczy większości innych sugestii - w tym wykresów QQ, wykresów paskowych, wykresów ulowych / rozgrzanych pszczół i wykresów skrzypcowych.
Teraz kilka potencjalnych rozwiązań:
1) transformacja ,
Jeśli logi lub odwrotności tworzą czytelny wykres pudełkowy, mogą być bardzo dobrym pomysłem, a oryginalna skala nadal może być pokazana na osi.
Dużym problemem jest to, że czasami nie ma „intuicyjnej” transformacji. Istnieje mniejszy problem, który wprawdzie same kwantyle tłumaczą się transformacjami monotonicznymi wystarczająco dobrze, ale płoty nie; jeśli po prostu wykreślisz przekształcone dane (tak jak ja tutaj), wąsy będą miały inne wartości x niż na oryginalnym wykresie.
Tutaj użyłem grzechu odwrotnego-hiperbolicznego (asinh); w ogonach jest trochę logarytmiczny i podobny do liniowego bliskiego zera, ale ludzie na ogół nie uważają za intuicyjną transformację, więc ogólnie nie poleciłbym tej opcji, chyba że dość intuicyjna transformacja taka jak log jest oczywista. Kod do tego:
xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)
2) podziałki skali - weź skrajne wartości odstające i ściśnij je w wąskie okna na każdym końcu o znacznie bardziej skompresowanej skali niż w środku. Jeśli to zrobisz, zdecydowanie polecam całkowite przełamanie całej skali.
opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)
3) przycinanie skrajnych wartości odstających (których normalnie nie radziłbym bez wyraźnego zaznaczenia tego, ale wygląda to na następny wykres, bez „<5” i „2>” na obu końcach), oraz
4) co nazywam „strzałkami” skrajnie odstających - podobnie jak przycinanie, ale z liczbą przyciętych wartości wskazanych na każdym końcu
xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))