我正在创建 ggplot2 wiki 上描述的 map (choropleth)。一切都像魅力一样,除了我遇到了一个问题,通过 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")

这有效,但是,我觉得我应该能够跳过预切割数据的步骤,并使用中断选项执行以下操作:
ggplot(mydata) +
aes(long,lat,group=group,fill=fill_continuous) +
geom_polygon() +
scale_fill_brewer(names="mybins", palette="PuOr", breaks=quantile(fill_continuous))

但这不起作用。相反,我收到了类似的错误:



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

最佳答案

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

  • Brewer 调色板 -- 确定可用颜色的最大数量
  • 断点数(或 bin 宽度)——必须用数据指定
  • 要绘制的实际数据——影响 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")
    

    关于r - 使用 ggplot2 中的 scale_fill_brewer() 函数设置数据断点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6738085/

    10-12 17:45
    查看更多