2012-04-28 63 views
17

我遇到geom_bars問題,其中當我在y軸上指定限制時,欄未呈現。我認爲以下應重現該問題:指定ylim時不顯示geom_bar欄

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)) 

這給了我這個

no bars

相同的代碼,而無需指定的限制正常工作。 geom_errorbar()似乎與問題沒有關係,但它確實說明了條形應該顯示的位置。

我試過使用coord_cartesian(ylim=c(2000,2500))它的作用是限制yaxis並獲得顯示條,但軸標籤會搞砸,我不明白我在做什麼。

感謝您的任何建議! (我,使用R 2.15.0和GGPLOT2 0.9.0)

回答

27

你可以試試,用library(scales)

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

代替,所概述here

+2

另請參見哈德利的迴應:「我認爲使用擠壓將是規範的,這是一個有效的用法,但它確實創建了一個欺騙圖。」 (要擴展第二點:當圖表基線不爲零時,通常不會考慮使用小節... – 2012-04-28 16:10:47

+3

感謝joran和Ben。請注意,任何發現此問題的人都必須加載'library (scale)'來使用oob參數 我在一般的條形圖上肯定與0以外的基線共享關注點,但在這種情況下,唯一可能的響應範圍是2000-2500,所以我認爲它說明了(也是人們所期待的,我現在沒有勇氣「做正確的事情」) – 2012-04-28 16:35:17

+3

@SamSwift,我相信它是'library(scales)'(帶有「s」)。 – A5C1D2H2I1M1N2O1R2T1 2012-04-28 16:42:53

8

增加對我的情況的解答這是略有不同的情況下,有人遇到這樣的:

當使用position="dodge",酒吧得到水平自動調整大小以填充空間,往往是遠遠超出了數據本身的限制。因此,即使您的x-axisy-axis限制都是limits=c(min-1, max+1,對於某些數據集,position="dodge"可能會將其調整爲超出該限制範圍,導致條不會出現。如果您的限制樓層爲0,甚至可能會發生這種情況,與上述情況不同。

scale_y_continous()scale_x_continuous()中都使用oob=rescale_none通過簡單地切斷position="dodge"完成的調整大小來解決此問題。

根據之前的評論,它需要package:scales,所以首先運行library(scales)

希望這可以幫助別人在上述答案只能讓你分半分身。

1

這對我來說基於之前共享的鏈接。

p + coord_cartesian(ylim=c(5,15))