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

时间:2017-02-21 11:00:00

标签: r ggplot2 legend na

我有一个带有图例渐变的地图,我想为NA值添加一个框。我的问题与this onethis 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,所以它会出现在渐变中,我想,我可以编写如下的解决方法,但所有这些解决方法对我来说似乎不是一个很好的解决方案我也想避免&#34;毫无意义的&#34;警告:

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

2 个答案:

答案 0 :(得分:13)

一种方法是将value变量拆分为离散比例。我使用cut()完成了此操作。然后,您可以使用离散色标,其中&#34; NA&#34;是一种独特的颜色标签。我使用过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)   

enter image description here

另一种解决方案

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

  1. 我们需要通过使用color某些内容映射到aes()来欺骗ggplot绘制单独的color比例。我使用aes(colour="")映射了一列空字符串。
  2. 为确保我们在每个多边形周围绘制彩色边界,我指定了一个手动色标,其中包含一个可能的值NA
  3. 最后,使用guides()override.aes来确保将新的颜色图例绘制为正确的颜色。
  4. 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)   
    

    enter image description here

答案 1 :(得分:0)

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