使用ggplot2中的scale\u fill\u brewer()函数设置数据断点

使用ggplot2中的scale\u fill\u brewer()函数设置数据断点,r,ggplot2,R,Ggplot2,我正在创建一个地图(choropleth),如上所述。除了我遇到一个通过scale_fill_brewer()函数将连续值映射到多边形填充颜色的问题外,所有操作都很有魅力 描述了我遇到的问题。如答案所示,我的解决方法是使用gtools quantcut()函数将数据预剪切到存储箱中: 更新:第一个示例实际上是正确的方法 require(gtools) # needed for quantcut() ... fill_factor <- quantcut(fill_continuous,

我正在创建一个地图(choropleth),如上所述。除了我遇到一个通过scale_fill_brewer()函数将连续值映射到多边形填充颜色的问题外,所有操作都很有魅力

描述了我遇到的问题。如答案所示,我的解决方法是使用gtools quantcut()函数将数据预剪切到存储箱中:

更新:第一个示例实际上是正确的方法

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")
但这不起作用。相反,我得到了一个类似以下的错误:

连续变量(综合分数)提供给离散量表(brewer)


我是否误解了“中断”选项的目的?还是中断了?

正如哈德利所解释的,中断选项会移动刻度,但不会使数据连续。因此,根据问题中的第一个示例预切割数据是使用scale\u fill\u brewer命令的正确方法。

预切割连续数据的一个主要问题是,代码中的不同点使用了三条信息:

  • Brewer调色板——确定可用颜色的最大数量
  • 断点的数量(或箱子宽度)——必须与数据一起指定
  • 待绘制的实际数据——影响Brewer调色板的选择(顺序/发散)
真正的恶性循环。这可以通过提供一个函数来打破,该函数接受数据和调色板,自动导出断点的数量,并返回可添加到
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)
  )
}

正如错误所说,
scale\u fill\u brewer
用于离散数据,而不是连续数据。感谢Hadley——感谢您的回答和编写包。我想我是假设连续数据+中断=离散。这是否意味着我的第一个例子(预切割我的连续数据)是这样做的“正确”方法?是的。图例与轴没有什么不同-在轴上设置断点不会使数据离散,它只是移动记号。非常感谢您的解释。我不敢相信你们回答了多少关于ggplot2的问题——你们得到了我对开源MVP的投票。看起来不错,但我得到了“错误:连续值提供给离散规模”。
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")