Boxplot cho một số phân phối?


9

Tôi cần vẽ 20 bản phân phối trong một biểu đồ duy nhất trong R và nó trông không ổn (lộn xộn) với tôi với boxplot thông thường (20 hộp) ngay cả với boxwex = 0,3. Bạn có thể gợi ý cho tôi cách tôi có thể vẽ một loại boxplot trong R cho 20 bản phân phối, với các dấu chấm cho trung vị và chỉ là một dòng thay vì hộp, như hình dưới đây. Ngoài ra, vui lòng gợi ý cho tôi nếu có bất kỳ phương thức R nào tạo ra các ô vuông đẹp, đặc biệt nếu bạn muốn hiển thị một số bản phân phối trong một biểu đồ.

 -----0----

Câu trả lời:


12

(Đây thực sự là một bình luận, nhưng vì nó yêu cầu một minh họa nên nó phải được đăng dưới dạng trả lời.)

Ed Tufte đã thiết kế lại boxplot trong Hiển thị thông tin định lượng trực quan của mình (trang 125, Ấn bản đầu tiên 1983) để cho phép "phân tích dữ liệu thăm dò, không chính thức, trong đó thời gian của nhân viên nghiên cứu nên dành cho các vấn đề khác ngoài vẽ đường." Tôi đã (theo cách hoàn toàn tự nhiên) đã mở rộng thiết kế lại của mình để phù hợp với việc vẽ các ngoại lệ trong ví dụ này hiển thị 70 ô vuông song song:

Tufte boxplots

Tôi có thể nghĩ ra một số cách để cải thiện điều này hơn nữa, nhưng đó là đặc điểm của những gì người ta có thể tạo ra khi khám phá một bộ dữ liệu phức tạp: chúng tôi có nội dung để thực hiện trực quan hóa cho phép chúng tôi xem dữ liệu; trình bày tốt có thể đến sau.

So sánh điều này với biểu hiện thông thường của cùng một dữ liệu:

Boxplots thông thường

Tufte trình bày một số thiết kế lại khác dựa trên nguyên tắc "tối đa hóa tỷ lệ mực dữ liệu". Giá trị của chúng nằm ở việc minh họa làm thế nào nguyên tắc này có thể giúp chúng ta thiết kế đồ họa khám phá hiệu quả. Như bạn có thể thấy, các cơ chế vẽ đồ thị của chúng tương đương với việc tìm kiếm bất kỳ nền tảng đồ họa nào trong đó bạn có thể vẽ các điểm và đường kẻ điểm.


Bạn có thể giúp vẽ đồ thị trên cùng trong R không?
samarasa

1
@kkp Đây là một bản nháp thô . Phản hồi tốt đẹp (+1).
chl

Và đây là những khả năng tiếp theo trong R - được tìm thấy trên SO: Các hàm có sẵn cho các ô vuông Tufte trong R? .
chl

@chl Cảm ơn bạn đã liên kết. Đối với bản ghi, nó bao gồm mã R hoạt động để tạo ra các ô vuông được thiết kế lại. Thật thú vị, câu hỏi đó đã được đăng chỉ ba ngày sau câu hỏi này ...
whuber

1
@naught Quan sát thú vị. Một ứng dụng tiềm năng của các ô vuông như vậy là một biến thể của "âm mưu sơ đồ lang thang" của Tukey, trong đó một biểu đồ phân tán (lớn) được cắt dọc theo tọa độ x và các giá trị y được tóm tắt bởi một ô vuông trong mỗi thùng. Một thủ tục như vậy có thể dễ dàng tạo ra 70 hoặc nhiều ô vuông cạnh nhau. Các ứng dụng bao gồm hầu hết mọi dữ liệu đa chiều: ví dụ: tọa độ x có thể biểu thị độ sâu của đất được lấy mẫu mỗi centimet và tọa độ y có thể biểu thị dữ liệu thu được tại nhiều vị trí.
whuber

10

Đậu

Có thể là những âm mưu tuyệt vời nhất từ ​​trước đến nay, về cơ bản, đây là một triển khai bội số nhỏ của các âm mưu violin. Các ô vĩ cầm có một lợi thế lớn so với các ô vuông: chúng có thể hiển thị nhiều chi tiết hơn cho các bản phân phối không bình thường (ví dụ: chúng có thể hiển thị các bản phân phối hai phương thức rất tốt). Bởi vì chúng thường dựa trên việc làm mịn Gaussian (hoặc tương tự), chúng sẽ không hoạt động thực sự tốt đối với các bản phân phối có điểm cao (như phân phối theo cấp số nhân), nhưng sau đó, cả hai sẽ không có hộp.

Beanplots có thể đạt được rất dễ dàng trong R - chỉ cần cài đặt gói beanplot :

library(beanplot)

# Sampling code from Greg Snow's answer:
my.dat <- lapply( 1:20, function(x) rnorm(x+10, sample( 10, 1), sample(3,1) ) )

beanplot(my.dat)

Đậu bắp!

Các beanplotchức năng có nhiều lựa chọn , vì vậy bạn có thể tùy chỉnh nó theo mong muốn của trái tim của bạn. Ngoài ra còn có một cách để làm beanplots trong ggplot2 (cần phiên bản mới nhất):

library(ggplot2)

my.dat <- lapply(1:20, function(x) rnorm(x+10, sample(10, 1), sample(3,1)))
my.df <- melt(my.dat)
ggplot(my.df, aes(x=L1, y=value, group=L1)) + geom_violin(trim=FALSE) +
  geom_segment(aes(x=L1-0.1, xend=L1+0.1, y=value, yend=value), colour='white')

Đậu xanh GGplot2


3

Dưới đây là một số mã R mẫu cho một vài cách để làm điều đó, bạn có thể sẽ muốn mở rộng về điều này (bao gồm các nhãn, v.v.) và có thể biến nó thành một hàm:

my.dat <- lapply( 1:20, function(x) rnorm(x+10, sample( 10, 1), sample(3,1) ) )

tmp <- boxplot(my.dat, plot=FALSE, range=0)

# box and median only
plot( range(tmp$stats), c(1,length(my.dat)), xlab='', ylab='', type='n' )
segments( tmp$stats[2,], seq_along(my.dat), tmp$stats[4,] )
points( tmp$stats[3,], seq_along(my.dat) )

# wiskers and implied box
plot( range(tmp$stats), c(1,length(my.dat)), xlab='', ylab='', type='n' )
segments( tmp$stats[1,], seq_along(my.dat), tmp$stats[2,] )
segments( tmp$stats[4,], seq_along(my.dat), tmp$stats[5,] )
points( tmp$stats[3,], seq_along(my.dat) )

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

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.