ggplot2 boxplot에서 특이 치를 어떻게 무시합니까? 나는 단순히 그것들이 사라지기를 원하지 않지만 (즉, outlier.size = 0) y 축 스케일이 1/3 백분위 수를 나타내도록 무시하기를 원합니다. 내 특이 치 때문에 “상자”가 너무 작아서 실제 선이 줄어 듭니다. 이것을 다루는 기술이 있습니까?
편집
예는 다음과 같습니다.
y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")
답변
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)
답변
사용 geom_boxplot(outlier.shape = NA)
이상치를 표시하지하고 scale_y_continuous(limits = c(lower, upper))
축 제한을 변경할 수 있습니다.
예입니다.
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
실제로 Ramnath가 자신의 답변 (및 의견에서 Andrie도)에서 알 수 있듯이 통계를 계산 한 후을 통해 척도를 자르는 것이 더 합리적 coord_cartesian
입니다.
coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))
(아직 scale_y_continuous
축 중단 문제를 해결하는 데 사용해야 할 수도 있습니다 .)
답변
나는 같은 문제가 있었고 Q1, Q2, median, ymin, ymax의 값을 다음과 같이 사전 계산했다 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
답변
한 가지 아이디어는 두 단계로 데이터 를 winsorize 하는 것입니다 .
-
주어진 첫 번째 백분위 수에서의 컷 또는 평균 이상의 N 표준 편차 또는
-
두 번째 단계에서 주어진 경계를 넘어서 그 경계의 값으로 값을 설정하십시오
나는 이것이 더 현대적인 강력한 기술에 의해 지배되어야하는 구식 방법 이라고 강조 해야 하지만 여전히 많은 방법을 접하게됩니다.
답변
geom_boxplot 함수의 “coef”옵션을 사용하면 사 분위수 범위에서 특이 치 컷오프를 변경할 수 있습니다. 이 옵션은 stat_boxplot 기능에 대해 설명되어 있습니다. 특이 치를 비활성화하기 위해 (즉, 정규 데이터로 처리됨) 기본값 1.5를 사용하는 대신 매우 높은 컷오프 값을 지정할 수 있습니다.
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)
답변
수염을 최대 및 최소 값으로 확장하려면 coef
인수를 조정할 수 있습니다 . 의 기본값 coef
은 1.5입니다 (즉, 수염의 기본 길이는 IQR의 1.5 배입니다).
# 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)