我正在创建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的连续变量(综合得分)。
我是否误解了“休息”选项的目的?还是破了?
答案 0 :(得分: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")
答案 1 :(得分:3)
正如Hadley所解释的那样,break选项会移动刻度线,但不会使数据连续。因此,根据问题中的第一个示例预先切割数据是使用scale_fill_brewer命令的正确方法。