2013-01-24 21 views
10

Tôi đang cố gắng tạo một cốt truyện mặt bằng ggplot và geom_errorbar. Tuy nhiên, mỗi khía cạnh khác nhau có thể có phạm vi x khác nhau rất nhiều, và do đó chiều rộng của thanh lỗi không phải là tìm kiếm "tốt". Dưới đây là MWE:ggplot geom_errorbar width khi faceting (và scale = "free")

library(ggplot2) 
test <- data.frame(group=rep(c(1,2,3),each=10), ymin=rnorm(30), ymax=rnorm(30)) 
test$x <- rnorm(30) * (1+(test$group==1)*20) 
ggplot(test, aes(x=x, ymin=ymin, ymax=ymax)) + 
    geom_errorbar(width=5) + facet_wrap(~ group, scale="free_x") 
ggplot(test, aes(x=x, ymin=ymin, ymax=ymax)) + 
    geom_errorbar(width=.2) + facet_wrap(~ group, scale="free_x") 

Trong ô đầu tiên, các thanh lỗi cho nhóm 1 trông tuyệt vời, nhưng 2 và 3 quá rộng. Trong ô thứ hai, các thanh lỗi quá nhỏ đối với nhóm 1. Có cách nào dễ dàng để sửa lỗi này không? Tôi nghĩ tôi có thể chỉ cần sử dụng width = 0, nhưng tôi muốn tránh điều đó.

First Plot

Second Plot

Trả lời

11

Giải pháp cho vấn đề này sẽ được thêm vào khung dữ liệu của bạn cột mới wd có chứa chiều rộng của errorbars cho mỗi cấp độ.

test <- data.frame(group=rep(c(1,2,3),each=10), ymin=rnorm(30), ymax=rnorm(30)) 
test$x <- rnorm(30) * (1+(test$group==1)*20) 
test$wd<-rep(c(10,0.5,0.5),each=10) 

Sau đó sử dụng cột mới này để thiết lập width= trong geom_errorbar(). Nó phải được đặt bên trong cuộc gọi aes().

ggplot(test, aes(x=x, ymin=ymin, ymax=ymax)) + 
    geom_errorbar(aes(width=wd)) + facet_wrap(~ group, scale="free_x") 

enter image description here