将 NA 值的框添加到 ggplot 图例以获取连续地图

Posted

技术标签:

【中文标题】将 NA 值的框添加到 ggplot 图例以获取连续地图【英文标题】:Add a box for the NA values to the ggplot legend for a continous map 【发布时间】:2017-07-10 23:12:51 【问题描述】:

我有一张带有图例渐变的地图,我想为 NA 值添加一个框。我的问题与this one 和this one 非常相似。我也读过this topic,但我在某处找不到“好的”解决方案,或者可能没有?

这是一个可重现的例子:

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). 

【问题讨论】:

不幸的是,我错过了评论已发布答案的声誉积分,但我认为@bdemarest 的最佳答案有一个小错误:对于“另一种解决方案”,在代码行guides(colour=guide_legend("No data", override.aes=list(colour="black")))。在override.aes 中,不应使用colour。它应该是fill,否则我猜默认盒子的颜色是黑色的,而colour你只需将颜色框轮廓更改为黑色。所以我建议在答案中换行如下:guides(colour=guide_legend("No data", override.aes=list(fill="black"))) @YoannPageaud,是的,好点。在测试您提出的更改时,我做了一些试验。我发现整行 guides(...) 并不是真正需要的。删除该行并将前一行更改为scale_colour_manual(values=NA, name="No data") 后,将创建相同的图。可能是我弄错了,或者是最近 2 年内更改为 ggplot2 的原因。 【参考方案1】:

一种方法是将您的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 个组成部分:

    我们需要欺骗 ggplot 通过使用 aes()something 映射到 color 来绘制单独的 color 比例。我使用 aes(colour="") 映射了一列空字符串。 为确保我们不会在每个多边形周围绘制彩色边界,我指定了一个手动色标,其中包含一个可能的值 NA。 最后,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)   

【讨论】:

感谢您的回答,但不幸的是这不是我想要的。我以前自己尝试过,但对我来说,在图例中有渐变并且没有组很重要。 @user5514978,我发布了另一种方法,应该非常接近您正在寻找的方法。 嘿,这很酷。非常感谢您的努力!尤其是你的第二眼,即使你已经给出了答案。 嘿,这很酷,但是当我重现您的第二个示例时,“无数据”框有时会出现在图例渐变下方,有时会出现在图例渐变上方。我不知道如何控制它。有什么建议吗?【参考方案2】:

这是可能的,但我在几年前就做到了。你不能使用指南。您必须单独设置值的连续比例以及 NA 的离散比例。这就是错误告诉你的内容,这就是 ggplot2 的工作原理。您是否尝试同时使用 scale_continuous 和 scale_discrete 因为您的设置相当尴尬,而不是简单地使用基本上用于简单情节设计的指南?

【讨论】:

你有例子吗?由于size = "NA",警告也会出现没有指南,但是当我删除它或将其更改为数字时,我的图例看起来不像以前那样。 抱歉耽搁了...您是否将您的 NA 视为一个因素? 除了上面给出的例子,参见:r-bloggers.com/custom-legend-in-r/amp

以上是关于将 NA 值的框添加到 ggplot 图例以获取连续地图的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggplot2中添加一个计算高于或低于某个值的点的图例?火山图

ggplot2:显示 x 轴值的附加特定图例

R语言ggplot2可视化:去除可视化结果中的NA图例删除缺失值图例

为了清楚起见,将图例添加到 ggplot

将图例添加到由 ggplot 包装的饼图

ggplot 密度图 alpha 未在图例中呈现