2013-05-23 34 views
10

Tôi đang thực hiện một boxplot trong đó xfill được ánh xạ tới các biến khác nhau, một chút như thế này:lực boxplots từ geom_boxplot để chiều rộng cố định

ggplot(mpg, aes(x=as.factor(cyl), y=cty, fill=as.factor(drv))) + 
    geom_boxplot() 

enter image description here

Như trong ví dụ trên, chiều rộng của các hộp của tôi xuất hiện khác nhau ở các giá trị x khác nhau, bởi vì tôi không có tất cả các kết hợp có thể có của các giá trị xfill.

Tôi muốn tất cả các hộp có cùng chiều rộng. Điều này có thể được thực hiện (lý tưởng mà không thao tác khung dữ liệu cơ bản, bởi vì tôi sợ rằng việc thêm dữ liệu giả sẽ khiến tôi bối rối trong quá trình phân tích sâu hơn)?

Suy nghĩ đầu tiên của tôi là

+ geom_boxplot(width=0.5) 

nhưng điều này không giúp; nó điều chỉnh chiều rộng của tập hợp đầy đủ các ô cho một mức độ yếu tố x nhất định.

This postgần như dường như có liên quan, nhưng tôi hoàn toàn không thấy cách áp dụng điều đó cho tình huống của mình. Sử dụng + scale_fill_discrete(drop=FALSE) dường như không thay đổi độ rộng của các thanh.

Trả lời

1

Sự cố là do một số ô kết hợp yếu tố không có mặt. Số lượng các điểm dữ liệu cho tất cả các kết hợp của mức cyldrv thể được kiểm tra qua xtabs:

tab <- xtabs(~ drv + cyl, mpg) 

tab 

# cyl 
# drv 4 5 6 8 
# 4 23 0 32 48 
# f 58 4 43 1 
# r 0 0 4 21 

Có ba ô trống. Tôi sẽ thêm dữ liệu giả mạo để ghi đè lên các vấn đề hiển thị.

Kiểm tra phạm vi của biến phụ thuộc (trục y). Dữ liệu giả cần phải nằm ngoài phạm vi này.

range(mpg$cty) 
# [1] 9 35 

Tạo một tập hợp con của mpg với các dữ liệu cần thiết cho cốt truyện:

tmp <- mpg[c("cyl", "drv", "cty")] 

Tạo một chỉ số cho các ô trống:

idx <- which(tab == 0, arr.ind = TRUE) 

idx 

# row col 
# r 3 1 
# 4 1 2 
# r 3 2 

Tạo ba dòng giả (với -1 làm giá trị cho cty):

fakeLines <- apply(idx, 1, 
        function(x) 
        setNames(data.frame(as.integer(dimnames(tab)[[2]][x[2]]), 
             dimnames(tab)[[1]][x[1]], 
             -1), 
           names(tmp))) 

fakeLines 

# $r 
# cyl drv cty 
# 1 4 r -1 
# 
# $`4` 
# cyl drv cty 
# 1 5 4 -1 
# 
# $r 
# cyl drv cty 
# 1 5 r -1 

Thêm các hàng để các dữ liệu hiện có:

tmp2 <- rbind(tmp, do.call(rbind, fakeLines)) 

Lô:

library(ggplot2) 
ggplot(tmp2, aes(x = as.factor(cyl), y = cty, fill = as.factor(drv))) + 
    geom_boxplot() + 
    coord_cartesian(ylim = c(min(tmp$cty - 3), max(tmp$cty) + 3)) 
    # The axis limits have to be changed to suppress displaying the fake data. 

enter image description here

Các vấn đề liên quan