Bỏ qua các ngoại lệ trong boxgot ggplot2


132

Làm thế nào tôi có thể bỏ qua các ngoại lệ trong boxgot ggplot2? Tôi không chỉ đơn giản muốn chúng biến mất (ví dụ: exmore.size = 0), nhưng tôi muốn chúng bị bỏ qua sao cho tỷ lệ trục y hiển thị phần trăm thứ 1/3. Các ngoại lệ của tôi đang làm cho "chiếc hộp" co lại quá nhỏ trên thực tế. Có một số kỹ thuật để đối phó với điều này?

Chỉnh sửa Dưới đây là một ví dụ:

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

nhập mô tả hình ảnh ở đây


Một số dữ liệu mẫu và một ví dụ có thể tái tạo sẽ giúp bạn dễ dàng hơn.
Andrie

3
tập tin của tôi là 200 meg! Chỉ cần lấy bất kỳ tập dữ liệu nào có nhiều datapoint giữa định lượng thứ 1 và thứ 3 và một vài ngoại lệ (bạn chỉ cần 1). Nếu ngoại lệ cách xa 1/3, thì nhất thiết các hộp sẽ thu nhỏ lại để chứa ngoại lệ
SFun28

Vâng, đó là những gì tôi đã nghĩ trong đầu. Tạo một bộ dữ liệu như vậy và sử dụng dput () để đăng nó ở đây cùng với câu lệnh ggplot () bạn sử dụng. Hãy giúp chúng tôi để giúp bạn.
Andrie

Bạn không thể thay đổi giới hạn trục y thành "phóng to" trên một phần của trục y mà bạn quan tâm?
Gavin Simpson

2
hãy để tôi nhìn .... Ồ vâng, xin lỗi. Chỉ cần thực hiện fivenum()trên dữ liệu để trích xuất những gì, IIRC, được sử dụng cho bản lề trên và dưới trên các ô vuông và sử dụng đầu ra đó trong scale_y_continuous()cuộc gọi mà @Ritchie đã hiển thị. Điều này có thể được tự động hóa rất dễ dàng bằng cách sử dụng các công cụ R và ggplot cung cấp. Nếu bạn cũng cần bao gồm cả râu, hãy cân nhắc sử dụng boxplot.stats()để có giới hạn trên và dưới cho râu và sử dụng sau đó scale_y_continuous().
Gavin Simpson

Câu trả lời:


140

Đây là một giải pháp sử dụng 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)

15
+1 cho tính toán tự động, +1 để sử dụng tọa độ_cartesian để thu phóng thay vì loại trừ dữ liệu
Ben Bolker

2
@Ben - bạn có hai tài khoản? =) @Ramnath - đây là một giải pháp thực sự thanh lịch
SFun28

7
Sử dụng phương pháp trên, các giới hạn có thể bị phá hủy bởi một cực nhỏ ở một bên và cực lớn ở một bên, ví dụ như ylim <- c(-0.1, 1000) * 1.05cho [1] 0.105 1050. Để có được giới hạn bằng nhau xung quanh trung bình bạn có thể sử dụng ylim + c(-0.05, 0.05) * diff(ylim) / 2. Theo tôi thì đẹp hơn
Bram Visser

2
@Ramnath các số liệu thống kê $ [c (1,5)] làm gì?
lukeg

3
Không hoạt động nếu bạn sử dụng facet_grid(). Sau đó, bạn có nhiều ô vuông thay vì một. Vì vậy, bạn không có được giới hạn đúng.
WitheShadow

204

Sử dụng geom_boxplot(outlier.shape = NA)để không hiển thị các ngoại lệ và scale_y_continuous(limits = c(lower, upper))để thay đổi giới hạn trục.

Một ví dụ.

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

Trên thực tế, như Ramnath đã thể hiện trong câu trả lời của mình (và Andrie cũng vậy trong các bình luận), sẽ có ý nghĩa hơn khi cắt các thang đo sau khi bạn tính toán thống kê, thông qua coord_cartesian.

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(Bạn có thể vẫn cần sử dụng scale_y_continuousđể sửa lỗi ngắt trục.)


1
Vì vậy, tôi sẽ phải tính toán mức thấp hơn / cao hơn - có lẽ bằng cách tính tỷ lệ phần trăm thứ 1? Có nghĩa là không có cách tự động ma thuật nào để nói với gg-lô2 bỏ qua các ngoại lệ và mở rộng quy mô một cách thông minh?
SFun28

38
Hãy cẩn thận với scale_y_continupt (giới hạn = ...) Điều này sẽ xóa dữ liệu nằm ngoài giới hạn và sau đó thực hiện các tính toán thống kê. Nói cách khác, giá trị trung bình và các bản tóm tắt khác sẽ bị ảnh hưởng. Nếu đây là những gì bạn muốn, thì tuyệt vời. Cách khác là sử dụng tọa độ_cartesian (giới hạn = ...) - điều này 'phóng to' mà không xóa dữ liệu hoặc ảnh hưởng đến các bản tóm tắt.
Andrie

@Andrie - cảm ơn! Tôi không muốn có ý nghĩa và tóm tắt khác bị ảnh hưởng.
SFun28

1
coord_cartesian()coord_flip()theo kinh nghiệm của tôi, tôi không chơi tốt scale_y_continuous().
PatrickT

1
Đây là giải pháp tốt nhất. Lý do tôi muốn ẩn các ngoại lệ là vì tôi cũng đang vẽ các điểm bị xáo trộn với geom_jitter. Trong trường hợp này, các ngoại lệ chỉ cản trở và làm cho nó có vẻ như có nhiều điểm hơn nên có.
williamsurles

14

Tôi đã có cùng một vấn đề và tính toán trước các giá trị cho Q1, Q2, median, ymin, ymax bằng cách sử dụng 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

Kết quả là một boxplot không có ngoại lệ. nhập mô tả hình ảnh ở đây


9

Một ý tưởng sẽ là chiến thắng dữ liệu trong thủ tục hai lần:

  1. chạy một lượt đầu tiên, tìm hiểu giới hạn là gì, ví dụ cắt ở phần trăm đã cho hoặc độ lệch chuẩn N trên giá trị trung bình hoặc ...

  2. trong lần chuyển thứ hai, đặt các giá trị vượt quá giới hạn đã cho thành giá trị của ràng buộc đó

Tôi nên nhấn mạnh rằng đây là một phương pháp lỗi thời cần phải bị chi phối bởi các kỹ thuật mạnh mẽ hiện đại hơn nhưng bạn vẫn bắt gặp nó rất nhiều.


1
Bất cứ ai chỉ xuống âm thầm : để lại nhận xét để giải thích lý do tại sao .
Dirk Eddelbuettel

Không phải tôi. Chỉ muốn thêm rằng việc có râu ria dừng lại ở phần trăm (thường là thứ 10 và thứ 90) dường như rất phổ biến với dữ liệu môi trường.
Richie Cotton

Tôi là một +1 im lặng và ước gì tôi có một thứ khác để cung cấp. Winsorizing hầu như luôn luôn được thực hiện trong tài chính + econ. Nếu SFun có các ngoại lệ làm hỏng hình ảnh dữ liệu, tôi tự hỏi ảnh hưởng của chúng đến phân tích dữ liệu là gì.
Richard Herron

đã đọc lại bài đăng này, bạn đã đề cập rằng việc hút gió là một kỹ thuật cũ hơn .... một số kỹ thuật hiện đại hơn sẽ là gì?
SFun28

1
Nói chung, các phương pháp mạnh mẽ như là một sự phát triển của hơn 30 năm qua.
Dirk Eddelbuettel

2

Tùy chọn "coef" của hàm geom_boxplot cho phép thay đổi điểm cắt ngoại lệ về các phạm vi liên vùng. Tùy chọn này được ghi lại cho hàm stat_boxplot. Để hủy kích hoạt các ngoại lệ (nói cách khác, chúng được coi là dữ liệu thông thường), người ta có thể thay vì sử dụng giá trị mặc định là 1,5 chỉ định giá trị ngưỡng rất cao:

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)

3
Nó chỉ mở rộng râu ria, nó không cứu được biểu đồ nào
Moody_Mudskipper

2

Nếu bạn muốn buộc râu ria mở rộng đến giá trị tối đa và tối thiểu, bạn có thể điều chỉnh coefđối số. Giá trị mặc định coeflà 1,5 (tức là độ dài mặc định của râu là 1,5 lần 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)

hình ảnh của p0

hình ảnh của p1


2

Inote :: geom_boxplot2 chỉ là những gì bạn muốn.

# 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)

nhập mô tả hình ảnh ở đây


Cảm ơn!! Đã thử nghiệm với dữ liệu của tôi, làm việc hoàn hảo! Tôi muốn giới thiệu giải pháp này, mặc dù tôi không chắc về sự ổn định / hỗ trợ lâu dài của những thứ github.
Gildas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.