为NA值添加一盒子ggplot传说的连续地图

问题描述 投票:7回答:2

我有一个传说梯度的地图,我想补充一箱的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的,所以它会出现在梯度,我想,我可以写类似下面的解决办法,但所有这些解决方法似乎并不像我一个漂亮的解决方案,我也想避免“无厘头”的警告:

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). 
r ggplot2 legend na
2个回答
13
投票

一种方法是你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)   

enter image description here

另一种解决方案

由于原来的海报说,他们需要保留的颜色渐变规模和彩条式的传奇人物,我张贴的另一种可能的解决方案。它有3个组成部分:

  1. 我们需要欺骗ggplot到使用color映射东西aes()绘制一个单独的color规模。我使用映射aes(colour="")空字符串的列。
  2. 为了确保我们不画围绕每个多边形有色边界,我指定了一个手动颜色规模与单个可能值,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)   

enter image description here


0
投票

这是可能的,但我也年前一样。您不能使用指南。你必须单独设置连续刻度值以及离散规模为来港。这是什么错误是告诉你这是怎么GGPLOT2作品。你尝试,因为同时使用scale_continuous和scale_discrete您的设置是比较尴尬的,而不是简单地使用它基本上是用于简单的情节设计指南?

© www.soinside.com 2019 - 2024. All rights reserved.