使用ggplot2中的scale_fill_brewer()函数设置数据的断点

时间:2011-07-18 19:14:24

标签: r ggplot2

我正在创建ggplot2 wiki所述的地图(等值线)。一切都像魅力一样,除了我遇到一个问题,通过scale_fill_brewer()函数将连续值映射到多边形填充颜色。

This question描述了我遇到的问题。在答案中,我的解决方法是使用gtools quantcut()函数将数据预先切割成bin:

更新:第一个示例实际上是执行此操作的正确方法

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

但是,我觉得我应该能够跳过预先剪切数据的步骤,并使用break选项执行类似的操作:

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

但这不起作用。相反,我得到的错误如下:

  

提供给离散scale_brewer的连续变量(综合得分)。

我是否误解了“休息”选项的目的?还是破了?

2 个答案:

答案 0 :(得分:4)

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

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

像这样使用:

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

答案 1 :(得分:3)

正如Hadley所解释的那样,break选项会移动刻度线,但不会使数据连续。因此,根据问题中的第一个示例预先切割数据是使用scale_fill_brewer命令的正确方法。