将 NA 值的框添加到连续图的 ggplot 图例中

2023-12-25

我有一张带有图例渐变的地图,我想为 NA 值添加一个框。我的问题非常类似于this one https://stackoverflow.com/questions/29151167/add-na-value-to-ggplot-legend-for-continuous-data-map and this one https://stackoverflow.com/questions/31705691/ggplot2-legend-for-na-in-scale-fill-brewer。我也读过这个话题 https://github.com/tidyverse/ggplot2/issues/410,但我在某处找不到“好的”解决方案,或者也许没有?

这是一个可重现的示例:

library(ggplot2)
map <- map_data("world")
map$value <- setNames(sample(-50:50, length(unique(map$region)), TRUE), 
                      unique(map$region))[map$region]
map[map$region == "Russia", "value"] <- NA
ggplot() +
  geom_polygon(data = map,
               aes(long, lat, group = group, fill = value)) +
  scale_fill_gradient2(low = "brown3", mid = "cornsilk1", high = "turquoise4",
                       limits = c(-50, 50),
                       na.value = "black")

所以我想为俄罗斯的 NA 值添加一个黑匣子。我知道,我可以用数字替换 NA,所以它会出现在渐变中,我想,我可以编写如下的解决方法,但所有这些解决方法对我来说似乎都不是一个很好的解决方案,而且我也想避免“毫无意义”的警告:

ggplot() +
  geom_polygon(data = map,
               aes(long, lat, group = group, fill = value)) +
  scale_fill_gradient2(low = "brown3", mid = "cornsilk1", high = "turquoise4",
                       limits = c(-50, 50),
                       na.value = "black") +
  geom_point(aes(x = -100, y = -50, size = "NA"), shape = NA, colour = "black") +
  guides(size = guide_legend("NA", override.aes = list(shape = 15, size = 10)))
Warning messages:
1: Using size for a discrete variable is not advised. 
2: Removed 1 rows containing missing values (geom_point). 

一种方法是拆分你的value变量转化为离散尺度。我已经使用了这个方法cut()。然后,您可以使用离散色标,其中“NA”是不同颜色标签之一。我用过scale_fill_brewer(),但还有其他方法可以做到这一点。

map$discrete_value = cut(map$value, breaks=seq(from=-50, to=50, length.out=8))

p = ggplot() +
    geom_polygon(data=map, aes(long, lat, group=group, fill=discrete_value)) +
    scale_fill_brewer(palette="RdYlBu", na.value="black") +
    coord_quickmap()

ggsave("map.png", plot=p, width=10, height=5, dpi=150)   

另一种解决方案

因为原始海报说他们需要保留颜色渐变比例和颜色条样式图例,所以我发布了另一个可能的解决方案。它有 3 个组件:

  1. 我们需要欺骗 ggplot 绘制一个单独的color通过使用来扩展aes() to map 某物 to color。我使用映射了一列空字符串aes(colour="").
  2. 为了确保我们do not在每个多边形周围绘制一个彩色边界,我指定了一个带有单个可能值的手动色阶,NA.
  3. 最后,guides()随着override.aes用于确保新的颜色图例绘制为正确的颜色。

p2 = ggplot() +
     geom_polygon(data=map, aes(long, lat, group=group, fill=value, colour="")) +
     scale_fill_gradient2(low="brown3", mid="cornsilk1", high="turquoise4",
                     limits=c(-50, 50), na.value="black") +
     scale_colour_manual(values=NA) +              
     guides(colour=guide_legend("No data", override.aes=list(colour="black")))

ggsave("map2.png", plot=p2, width=10, height=5, dpi=150)   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 NA 值的框添加到连续图的 ggplot 图例中 的相关文章

随机推荐