2012-04-28 38 views
17

Tôi gặp sự cố với geom_bars trong đó các thanh không được hiển thị khi tôi chỉ định giới hạn trên trục y. Tôi tin rằng những điều sau đây nên tạo lại vấn đề:thanh geom_bar không hiển thị khi chỉ định ylim

data <- structure(list(RoleCond = structure(c(1L, 1L, 2L, 2L), .Label = c("Buyer", "Seller"), class = "factor"), 
        ArgCond = structure(c(1L, 2L, 1L, 2L), .Label = c("No Argument", "Argument"), class = "factor"), 
        mean = c(2210.71428571429, 2142.70833333333, 2282.40740740741, 2346.2962962963), 
        se = c(20.1231042081511, 16.7408757749718, 20.1471554637891, 15.708092540868)), 
        .Names = c("RoleCond", "ArgCond", "mean", "se"), row.names = c(NA, -4L), class = "data.frame") 

library(ggplot2)  
ggplot(data=data, aes(fill=RoleCond, y=mean, x=ArgCond)) + 
     geom_bar(position="dodge", stat="identity") + 
     geom_errorbar(limits, position=dodge, width=0.1, size=.75) + 
     scale_y_continuous(limits=c(2000,2500)) 

mà mang lại cho tôi

no bars

Mã này tương tự mà không có giới hạn nhất định hoạt động tốt. Geom_errorbar() dường như không liên quan đến vấn đề, nhưng nó minh họa nơi các thanh sẽ được hiển thị.

Tôi đã thử sử dụng coord_cartesian(ylim=c(2000,2500)) hoạt động để hạn chế yaxis và nhận các thanh để hiển thị, nhưng các nhãn trục bị rối tung lên và tôi không hiểu những gì tôi đang làm với nó.

Cảm ơn mọi đề xuất! (Tôi đang sử dụng R 2.15.0 và ggplot2 0.9.0)

Trả lời

27

Bạn có thể thử với library(scales):

+ scale_y_continuous(limits=c(2000,2500),oob = rescale_none) 

thay vào đó, như được nêu here.

+2

Xem thêm câu trả lời của Hadley: "Tôi nghĩ rằng sử dụng squish sẽ là kinh điển. Và đây là một sử dụng hợp lệ, nhưng nó tạo ra một đồ thị lừa dối." (Để mở rộng vào điểm thứ hai: nói chung * không * được coi là ý tưởng tốt để sử dụng các thanh khi đường cơ sở đồ thị không phải là 0 ... –

+3

Cảm ơn joran và Ben. Lưu ý cho bất kỳ ai tìm thấy điều này, tôi phải tải 'thư viện Tôi chắc chắn chia sẻ mối quan tâm với các đường cơ sở khác với 0 trên đồ thị thanh nói chung, nhưng trong trường hợp này, phạm vi phản ứng duy nhất có thể là 2000-2500, vì vậy tôi nghĩ rằng nó minh họa sự khác biệt khá (cũng, đó là những gì mọi người mong đợi và tôi không cảm thấy đủ can đảm để "làm đúng" tại thời điểm này) –

+3

@SamSwift, tôi tin rằng đó là 'thư viện (vảy)' (với một "s"). – A5C1D2H2I1M1N2O1R2T1

8

Thêm một câu trả lời cho trường hợp của tôi đó là một chút khác nhau trong trường hợp ai đó đi qua này:

Khi sử dụng position="dodge", các thanh được theo chiều ngang thay đổi kích cỡ tự động để lấp đầy khoảng trống mà thường là vượt quá xa giới hạn của dữ liệu riêng của mình. Do đó, ngay cả khi cả hai giới hạn x-axisy-axis của bạn là limits=c(min-1, max+1, đối với một số tập hợp dữ liệu nhất định, thì position="dodge" có thể định lại kích thước vượt quá giới hạn đó, làm cho các thanh không xuất hiện. Điều này thậm chí có thể xảy ra nếu giới hạn của bạn là 0, không giống như trường hợp trên.

Sử dụng oob=rescale_none trong cả hai scale_y_continous()scale_x_continuous() khắc phục vấn đề này bằng cách chỉ cần cắt giảm kích thước được thực hiện bởi position="dodge".

Theo nhận xét trước đó, yêu cầu phải package:scales để chạy library(scales) trước tiên.

Hy vọng điều này sẽ giúp người khác trong đó các câu trả lời ở trên chỉ giúp bạn chia tay.

1

Điều này làm việc cho tôi dựa trên liên kết được chia sẻ trước đó.

p + coord_cartesian(ylim=c(5,15)) 
Các vấn đề liên quan