颜色比 choroplethr 中 num_colors 指定的颜色少

Fewer colors than specified by num_colors in choroplethr

提问人:Eponymous 提问时间:10/27/2022 最后编辑:AriEponymous 更新时间:11/2/2022 访问量:85

问:

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

9 colors

如果我将颜色的数量减少到 7,即数据中唯一值的实际数量,则图例只有 5 种颜色。对两组值进行装箱,而不是对 none 进行装箱。7 colors specified; 5 are used

如果我进一步减少到 5 种颜色,则只有 4 种被使用。5 colors specified; 4 are used

指定 6 种颜色会得到 5,就像 7 一样,但装箱方式与 7 不同。

如果我根据值剪切数据,我可以强制它使用所有 7 种颜色,在这种情况下,将忽略较低的num_colors值:

df$value <- cut (df$value, breaks = c(0,unique(sort(df$value))))

# of colors forced by cuts

那么我的问题是,为什么指定数量的颜色没有得到尊重,有没有办法强制这样做。

TIA。

r choroplethr

评论


答:

0赞 Ari 10/28/2022 #1

我认为这里发生了几件事。

对我来说,最容易解决的问题是夏威夷和阿拉斯加没有将您的自定义比例应用于它们(因此显示为黑色)。这是因为 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()

enter image description here

对不起,但我并不完全理解您报告的其他问题。我要说的一件事是,分箱是 imlement 更复杂的功能之一(我是 choroplethr 的作者)。这不仅仅是进行分箱的数学运算,它还使标签看起来很漂亮。你可以在这里看到它的代码。

在您的情况下,一种选择可能是将数字转换为因子,然后将它们馈送到等值线:

df$value = as.factor(df$value)
state_choropleth(df)

enter image description here

我还应该说,我在关于choroplethr的在线课程中涵盖了这些问题,所有这些课程现在都是免费的。如果您有兴趣服用它们,可以在此处了解更多信息。

评论

0赞 Eponymous 10/28/2022
Ari,非常感谢您的回复。我是这个套餐的忠实粉丝,所以也谢谢你!
0赞 Eponymous 10/28/2022
我知道 OO 方法,但我没有使用它,因为我不清楚如何让 ggplot 的其他部分与它一起工作。例如,如何移动图例?另一个问题很简单,num_colors就是没有按照我期望的方式工作。也就是说,如果我告诉它使用 5 种颜色,并且有 >5 个值可以绘制(这样 5 个值就可以工作),通常会有 <5 种颜色。我知道装箱很复杂,但对我来说,最小结果应该是我要求的 # 种颜色。如何对它们进行装箱就不那么重要了。(我应该查看教程。
0赞 Ari 10/28/2022
@Eponymous 您的问题和评论都提出了不止一个问题。SO 并不是真正为此而设计的。我建议针对您遇到的每个特定问题发布一个新问题。
0赞 Eponymous 10/28/2022
我最初的问题是关于num_colors,而不是OO的东西。:-)这对我来说是一个单一的问题,但请让我知道如何改进它,我会的。
1赞 Eponymous 11/11/2022
没关系。我再问一个问题。但实际上,在这里,我只是在说明当颜色的数量(我所问的事情)发生变化时会发生什么。