2013-01-23 34 views
18

是不變的,我得到一個警告消息,我不爲簡單的條形圖中GGPLOT2爲什麼我得到「position_dodge需要不斷寬度」,即使在寬度GGPLOT2

> df <- data.frame(X = 127:131, Y = rnorm(5)) 
> df 
    X   Y 
1 127 0.9391077 
2 128 -0.9392529 
3 129 -1.1296221 
4 130 1.1454907 
5 131 1.8564596 
> ggplot(df) + geom_bar(aes(X,Y), stat ="identity", position = "dodge") 
Warning message: 
position_dodge requires constant width: output may be incorrect 

理解它似乎只發生對於某些X值的範圍。我已經搜索了這方面的信息,但似乎都在談論寬度真的不同的情況,或者stat不是「身份」的情況。在這種情況下,X值只是整數,所以它應該很簡單。

生成的圖表看起來不錯,所以我很不滿意,只是忽略了一個我不明白的警告。

任何想法是怎麼回事?

+4

我已經提交了關於github上的惡意警告的問題。 https://github.com/hadley/scales/issues/33 –

+1

現在已經在'scales'的開發版本中修復了這個問題。 –

回答

38

設置options(warn = 2, error = recover),重新運行代碼可以讓我們發現問題。

裏面的collide功能(在調用棧號16),有這一段代碼:

if (!zero_range(range(widths))) { 
    warning(name, " requires constant width: output may be incorrect", 
     call. = FALSE) 
} 

Floating point rounding errors意味着widths需要稍微不同的值。

format(widths, digits = 22) 
# [1] "0.9000000000000056843419" "0.8999999999999914734872" "0.8999999999999772626325" 

tolerance檢查這些數字都是一樣的過於嚴格:約2.2E-14。

args(zero_range) 
# function (x, tol = .Machine$double.eps * 100) 
# NULL 
.Machine$double.eps * 100 
# [1] 2.220446e-14 

所以警告是錯誤的;別擔心。

+1

壞蛋答案。謝謝。 – Michael

相關問題