2015-05-16 23 views
8

dữ liệu của tôi:Các giới hạn y khác nhau trên biểu đồ dạng thanh lưới ggplot?

day variable  value 
1 Fri  avg1 446.521127 
2 Mon  avg1 461.676056 
3 Sat  avg1 393.366197 
4 Sun  avg1 435.985714 
5 Thu  avg1 445.571429 
6 Tue  avg1 441.549296 
7 Wed  avg1 462.042254 
8 Fri  avg2 7.442113 
9 Mon  avg2 7.694648 
10 Sat  avg2 6.556056 
11 Sun  avg2 7.266571 
12 Thu  avg2 7.426286 
13 Tue  avg2 7.359577 
14 Wed  avg2 7.700282 

Vấn đề của tôi là tôi muốn tạo ra một biểu đồ hình cột sử dụng facet_grid hiển thị mỗi bộ dữ liệu trung bình theo ngày, nhưng các quan sát đủ tương tự mà tôi đã tìm thấy nó hữu ích để xác định y - sử dụng số scale_y_continuous.

Vì vậy, nếu tôi gán ggplot tôi để g <- ggplot(df, aes(x=day, y=value)), tôi có thể nhận được một nửa những gì tôi muốn bằng cách mỗi người trong số:

g + geom_bar(stat="identity") + facet_grid(variable~., scales="free") 

g + geom_bar(stat="identity") + scale_y_continuous(limits=c(300,500), oob=rescale_none) 

Tuy nhiên, tôi không biết làm thế nào để sử dụng lưới khía cạnh và sau đó chỉ định một scale_y_cont sẽ giới hạn kích thước của các trục y riêng biệt. Có giải pháp nào không?

+0

Bạn có nói rằng bạn không muốn giới hạn dưới của mỗi khía cạnh bằng không? – eipi10

+0

bên phải, tôi muốn giới hạn dưới là giá trị 'trung bình' trong phạm vi – knl

+0

Vì vậy, bạn muốn giới hạn dưới của mặt nạ 'avg1' là khoảng 0,5 * max (avg1) và giới hạn dưới của mặt nạ' avg2' thành khoảng 0,5 * tối đa (avg2)? Tôi khuyên bạn nên chống lại bằng cách sử dụng một cốt truyện thanh nếu bạn không muốn quy mô y để đi xuống không, vì sự khác biệt tương đối giữa chiều cao thanh sẽ được misleadingly lớn. – eipi10

Trả lời

8

Bạn có thể tạo các phạm vi y riêng biệt cho các khía cạnh khác nhau khi sử dụng geom_point, nhưng tôi không biết cách để làm điều đó với geom_bar. Để đặt phạm vi y cụ thể với facet_wrapgeom_bar, cách duy nhất tôi biết là tạo các ô riêng biệt và sau đó đặt chúng cạnh nhau bằng cách sử dụng grid.arrange từ gói gridExtra. (Sử dụng thang đo thẳng đứng không xuống 0 sẽ phóng đại sự khác biệt giữa các điểm/thanh, có thể gây hiểu nhầm, nhưng bạn sẽ phải quyết định xem nó có hợp lý cho trường hợp cụ thể của bạn không.)

Đầu tiên, đây là Phiên bản geom_point: Ý tưởng là tạo khung dữ liệu "giả" với giá trị thấp hơn và trên bạn muốn cho ylim và sau đó "vẽ" chúng bằng cách sử dụng geom_blank. geom_blank không vẽ bất kỳ điều gì, nhưng việc thêm địa lý này sẽ đảm bảo rằng phạm vi trục là những gì bạn muốn cho mỗi khía cạnh.

ddummy = data.frame(day=NA, variable=rep(c("avg1", "avg2"), each=2), 
       value=c(0.5*max(df$value[df$variable=="avg1"]), 
         1.1*max(df$value[df$variable=="avg1"]), 
         0.5*max(df$value[df$variable=="avg2"]), 
         1.1*max(df$value[df$variable=="avg2"]))) 

g <- ggplot(df, aes(x=day, y=value)) 

g + geom_point() + 
    geom_blank(data=dummy, aes(day, value)) + 
    facet_grid(variable ~ ., scales="free") 

enter image description here

Và đây là lô riêng biệt, đặt cùng với grid.arrange:

avg1 = ggplot(df[df$variable=="avg1",], aes(x=day, y=value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable) + 
    coord_cartesian(ylim=c(300,500)) 

avg2 = ggplot(df[df$variable=="avg2",], aes(x=day, y=value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable) + 
    coord_cartesian(ylim=c(3.5,8)) 

gridExtra::grid.arrange(avg1, avg2, ncol=2) 

enter image description here

Để sử dụng geom_segment (mỗi nhận xét của bạn), bạn có thể làm điều này:

library(dplyr) 

ggplot(df %>% group_by(variable) %>% 
     mutate(ymin=0.5*max(value))) + 
    geom_segment(aes(x=day, xend=day, y=ymin, yend=value), 
       size=5, colour=hcl(195,100,65)) + 
    facet_grid(variable ~ ., scales="free") 
+0

Tuyệt vời. Tại sao không phải là phạm vi y thực thi trên biểu đồ thanh như với 'geom_point'? – knl

+0

Tôi khá chắc chắn đó là vì 'geom_bar'" giả định "thanh nên đi xuống không, vì vậy phạm vi hiệu quả của" dữ liệu "' geom_bar' là ngầm sử dụng là số không đến tối đa (ydata). Việc thêm một khung dữ liệu giả với một phạm vi y trên 0 không thay đổi điều đó, vì vậy nó không thay đổi cốt truyện. Tuy nhiên, nếu bạn thay đổi '0,5' trong khung dữ liệu giả của tôi thành' -0.5', bạn sẽ thấy rằng 'geom_bar' mở rộng phạm vi y dưới 0, bởi vì bây giờ bạn đã mở rộng phạm vi y của ô . – eipi10

+0

oh, tất nhiên rồi.Nếu bạn vẽ 'geom_point' mà không có giả, bạn sẽ có kết quả tương tự. Tôi tự hỏi nếu bạn có thể sử dụng 'geom_segment' để vẽ từ max (avg1/2)/2 đến giá trị. – knl

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