提问人:Eponymous 提问时间:10/27/2022 最后编辑:AriEponymous 更新时间:11/2/2022 访问量:85
颜色比 choroplethr 中 num_colors 指定的颜色少
Fewer colors than specified by num_colors in choroplethr
问:
num_colors似乎经常得不到尊重。具有 7 个不同值的 9 个状态的简单情况:
> df
region value
1 alabama 1
2 wyoming 5
3 arizona 5
4 arkansas 5
5 california 8
6 colorado 15
7 iowa 22
8 ohio 29
9 florida 36
> dput(df)
structure(list(region = c("alabama", "wyoming", "arizona", "arkansas",
"california", "colorado", "iowa", "ohio", "florida"), value = c(1,
5, 5, 5, 8, 15, 22, 29, 36)), class = "data.frame", row.names = c(NA,
-9L))
使用酿酒器色标(num_colors为 9 的简单地图会生成一个图例,其中 7 个值中的每一个都具有单独的颜色(阿拉斯加和夏威夷不适用于此方法,但这是另一个问题):
library(choroplethr)
library(ggplot2)
g <- state_choropleth(df, num_colors = 9)
gg <- g + scale_fill_brewer(name="Count",palette="YlOrRd", drop=FALSE, na.value="grey")
gg
如果我将颜色的数量减少到 7,即数据中唯一值的实际数量,则图例只有 5 种颜色。对两组值进行装箱,而不是对 none 进行装箱。
指定 6 种颜色会得到 5,就像 7 一样,但装箱方式与 7 不同。
如果我根据值剪切数据,我可以强制它使用所有 7 种颜色,在这种情况下,将忽略较低的num_colors值:
df$value <- cut (df$value, breaks = c(0,unique(sort(df$value))))
那么我的问题是,为什么指定数量的颜色没有得到尊重,有没有办法强制这样做。
TIA。
答:
我认为这里发生了几件事。
对我来说,最容易解决的问题是夏威夷和阿拉斯加没有将您的自定义比例应用于它们(因此显示为黑色)。这是因为 choroplethr 使用 ggplot2 的“自定义注释”功能将它们单独渲染,然后手动放置在墨西哥所在的位置。ggplot2 中自定义注解的工作方式是,您的调用仅应用于主图像(而不是自定义注解)。+ scale_fill_brewer()
同时应用于所有 3 个图像(美国大陆、阿拉斯加和夏威夷)的自定义比例的方法是使用 Choroplethr 的面向对象功能。
要了解它们是如何工作的,首先要看看实际是如何工作的:state_choropleth
> state_choropleth # no parentheses
function(df, title="", legend="", num_colors=7, zoom=NULL, reference_map = FALSE)
{
c = StateChoropleth$new(df)
c$title = title
c$legend = legend
c$set_num_colors(num_colors)
c$set_zoom(zoom)
if (reference_map) {
if (is.null(zoom))
{
stop("Reference maps do not currently work with maps that have insets, such as maps of the 50 US States.")
}
c$render_with_reference_map()
} else {
c$render()
}
}
<bytecode: 0x7fde42ffd910>
<environment: namespace:choroplethr>
以下是如何使用这些功能将自定义比例应用于注释以及美国大陆:
c = StateChoropleth$new(df)
c$set_num_colors(9)
c$ggplot_scale = scale_fill_brewer(name="Count",palette="YlOrRd", drop=FALSE, na.value="grey")
c$render()
对不起,但我并不完全理解您报告的其他问题。我要说的一件事是,分箱是 imlement 更复杂的功能之一(我是 choroplethr 的作者)。这不仅仅是进行分箱的数学运算,它还使标签看起来很漂亮。你可以在这里看到它的代码。
在您的情况下,一种选择可能是将数字转换为因子,然后将它们馈送到等值线:
df$value = as.factor(df$value)
state_choropleth(df)
我还应该说,我在关于choroplethr的在线课程中涵盖了这些问题,所有这些课程现在都是免费的。如果您有兴趣服用它们,可以在此处了解更多信息。
评论