Jak mógłbym zignorować wartości odstające w wykresie pudełkowym ggplot2? Nie chcę, aby po prostu zniknęły (tj. Outlier.size = 0), ale chcę, aby były ignorowane w taki sposób, aby oś y skalowała się tak, aby pokazywała 1/3 percentyl. Moje wartości odstające powodują, że „pudełko” kurczy się tak małe, że jest praktycznie linią. Czy są jakieś techniki radzenia sobie z tym?
Edycja Oto przykład:
y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")
fivenum()
na danych, aby wyodrębnić to, co, IIRC, jest używane dla górnych i dolnych zawiasów na wykresach pudełkowych i użyj tego wyniku wscale_y_continuous()
wywołaniu, które pokazał @Ritchie. Można to bardzo łatwo zautomatyzować za pomocą narzędzi dostarczanych przez R i ggplot. Jeśli musisz uwzględnić również wąsy, rozważ użycie,boxplot.stats()
aby uzyskać górną i dolną granicę wąsów, a następnie użyjscale_y_continuous()
.Odpowiedzi:
Oto rozwiązanie wykorzystujące boxplot.stats
# create a dummy data frame with outliers df = data.frame(y = c(-100, rnorm(100), 100)) # create boxplot that includes outliers p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1))) # compute lower and upper whiskers ylim1 = boxplot.stats(df$y)$stats[c(1, 5)] # scale y limits based on ylim1 p1 = p0 + coord_cartesian(ylim = ylim1*1.05)
źródło
ylim <- c(-0.1, 1000) * 1.05
Daje[1] 0.105 1050
. Aby uzyskać równe limity wokół średniej, której możesz użyćylim + c(-0.05, 0.05) * diff(ylim) / 2
. Moim zdaniem ładniejsze.facet_grid()
. Wtedy masz wiele wykresów pudełkowych zamiast jednego. W ten sposób nie masz odpowiednich ograniczeń.Służy
geom_boxplot(outlier.shape = NA)
do niewyświetlania wartości odstających iscale_y_continuous(limits = c(lower, upper))
do zmiany granic osi.Przykład.
n <- 1e4L dfr <- data.frame( y = exp(rlnorm(n)), #really right-skewed variable f = gl(2, n / 2) ) p <- ggplot(dfr, aes(f, y)) + geom_boxplot() p # big outlier causes quartiles to look too slim p2 <- ggplot(dfr, aes(f, y)) + geom_boxplot(outlier.shape = NA) + scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9))) p2 # no outliers plotted, range shifted
W rzeczywistości, jak pokazał Ramnath w swojej odpowiedzi (a także Andrie w komentarzach), bardziej sensowne jest przycinanie skali po obliczeniu statystyki za pomocą
coord_cartesian
.coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))
(Prawdopodobnie nadal będziesz musiał użyć,
scale_y_continuous
aby naprawić pęknięcia osi).źródło
coord_cartesian()
zcoord_flip()
mojego doświadczenia nie współgra, więc wolęscale_y_continuous()
.Miałem ten sam problem i wstępnie obliczyłem wartości dla Q1, Q2, mediana, ymin, ymax używając
boxplot.stats
:# Load package and generate data library(ggplot2) data <- rnorm(100) # Compute boxplot statistics stats <- boxplot.stats(data)$stats df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], upper=stats[4], ymax=stats[5]) # Create plot p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, ymax=ymax)) + geom_boxplot(stat="identity") p
W rezultacie otrzymujemy wykres pudełkowy bez wartości odstających.
źródło
Jednym z pomysłów byłoby wygranie danych w procedurze dwuprzebiegowej:
wykonaj pierwszy przebieg, dowiedz się, jakie są granice, np. obcięcie o dany percentyl lub odchylenie standardowe N powyżej średniej, lub ...
w drugim przebiegu ustaw wartości poza podanym ograniczeniem na wartość tego ograniczenia
Powinienem podkreślić, że jest to staroświecka metoda, która powinna być zdominowana przez bardziej nowoczesne, solidne techniki, ale wciąż często się z nią spotykasz.
źródło
Opcja „coef” funkcji geom_boxplot umożliwia zmianę wartości granicznej wartości odstającej w zakresie przedziałów międzykwartylowych. Ta opcja jest udokumentowana dla funkcji stat_boxplot. Aby dezaktywować wartości odstające (innymi słowy, są one traktowane jak zwykłe dane), można zamiast używać domyślnej wartości 1,5, określić bardzo wysoką wartość odcięcia:
library(ggplot2) # generate data with outliers: df = data.frame(x=1, y = c(-10, rnorm(100), 10)) # generate plot with increased cutoff for outliers: ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)
źródło
Jeśli chcesz zmusić wąsy, aby rozciągały się do wartości max i min, możesz zmodyfikować
coef
argument. Wartość domyślnacoef
to 1,5 (tj. Domyślna długość wąsów jest 1,5 razy większa od IQR).# Load package and create a dummy data frame with outliers #(using example from Ramnath's answer above) library(ggplot2) df = data.frame(y = c(-100, rnorm(100), 100)) # create boxplot that includes outliers p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1))) # create boxplot where whiskers extend to max and min values p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)
źródło
Ipaper :: geom_boxplot2 jest właśnie tym, czego chcesz.
# devtools::install_github('kongdd/Ipaper') library(Ipaper) library(ggplot2) p <- ggplot(mpg, aes(class, hwy)) p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)
źródło