2011-07-18 67 views
4

我正在按照ggplot2 wiki上的描述創建一個映射(choropleth)。除了我遇到了通過scale_fill_brewer()函數將連續值映射到多邊形填充顏色的問題之外,一切都像魅力一樣。使用ggplot2中的scale_fill_brewer()函數設置數據的斷點

This question描述了我遇到的問題。作爲答案,我的解決方法一直是預切割我的數據轉換成使用gtools quantcut()函數箱:

UPDATE:第一個例子實際上是這樣做

require(gtools) # needed for quantcut() 

... 

fill_factor <- quantcut(fill_continuous, q=seq(0,1,by=0.25)) 
ggplot(mydata) + 
aes(long,lat,group=group,fill=fill_factor) + 
geom_polygon() + 
scale_fill_brewer(name="mybins", palette="PuOr") 
正道

這工作,不過,我覺得我應該能夠跳過預切割我的數據的步驟,做這樣的事與遊選項:

ggplot(mydata) + 
aes(long,lat,group=group,fill=fill_continuous) + 
geom_polygon() + 
scale_fill_brewer(names="mybins", palette="PuOr", breaks=quantile(fill_continuous)) 

但是,這是行不通的。相反,我得到一個類似的錯誤:

Continuous variable (composite score) supplied to discrete scale_brewer.

我誤解了「休息」選項的目的?還是破碎了?

+2

由於錯誤說'scale_fill_brewer'是離散的數據,而不是連續的。 – hadley

+0

謝謝哈德利 - 尋求答案並編寫包裝。我想我假設連續數據+休息=離散。 這是否意味着我的第一個示例(預先裁剪我的連續數據)是完成此操作的「正確」方法? – Peter

+1

是的。圖例與軸沒有區別 - 在軸上設置中斷不會使數據離散,它只是移動刻度標記。 – hadley

回答

3

正如Hadley解釋的那樣,break選項會移動ticks,但不會使數據連續。因此,按照問題中的第一個示例預裁剪數據是使用scale_fill_brewer命令的正確方法。

4

與預切割的連續數據的一個主要問題是,有三段信息中的代碼的不同點處使用:

  • 的布魯爾調色板 - 確定的顏色可用的最大數目
  • 的斷裂點(或箱寬度)的數量 - 必須用
  • 的實際數據要被繪製的數據來指定 - 影響布魯爾調色板的選擇(順序/發散)

一個真正的惡性循環。這可以通過提供一個接受數據和調色板的函數來打破,它會自動導出斷點的數量並返回一個可以添加到ggplot對象的對象。大意如下的內容:

fill_brewer <- function(fill, palette) { 
    require(RColorBrewer) 
    n <- brewer.pal.info$maxcolors[palette == rownames(brewer.pal.info)] 
    discrete.fill <- call("quantcut", match.call()$fill, q=seq(0, 1, length.out=n)) 
    list(
    do.call(aes, list(fill=discrete.fill)), 
    scale_fill_brewer(palette=palette) 
) 
} 

使用方法如下:

ggplot(mydata) + aes(long,lat,group=group) + geom_polygon() + 
    fill_brewer(fill=fill_continuous, palette="PuOr") 
+0

看起來不錯,但我得到「錯誤:提供給離散比例的連續值」。 – Julian

相關問題