将 NA 值的框添加到连续地图的 ggplot 图例
Add a box for the NA values to the ggplot legend for a continous map
我有一张带有图例渐变的地图,我想为 NA 值添加一个框。我的问题与 this one and . Also I have read this topic 非常相似,但我在某处找不到 "nice" 解决方案,或者可能没有?
这是一个可重现的例子:
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,所以它会出现在渐变中,我想,我可以写一个如下所示的解决方法,但所有这些解决方法对我来说似乎都不是一个很好的解决方案,我也想避免 "senseless" 警告:
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).
这是可能的,但我几年前就做到了。您不能使用指南。您必须单独设置值的连续比例以及 NA 的离散比例。这就是错误告诉您的内容,这就是 ggplot2 的工作原理。您是否尝试同时使用 scale_continuous 和 scale_discrete 因为您的设置相当笨拙,而不是简单地使用基本上用于简单情节设计的指南?
一种方法是将您的 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 个组成部分:
- 我们需要通过使用
aes()
将 something 映射到 color
来欺骗 ggplot 绘制单独的 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)
我有一张带有图例渐变的地图,我想为 NA 值添加一个框。我的问题与 this one and
这是一个可重现的例子:
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,所以它会出现在渐变中,我想,我可以写一个如下所示的解决方法,但所有这些解决方法对我来说似乎都不是一个很好的解决方案,我也想避免 "senseless" 警告:
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).
这是可能的,但我几年前就做到了。您不能使用指南。您必须单独设置值的连续比例以及 NA 的离散比例。这就是错误告诉您的内容,这就是 ggplot2 的工作原理。您是否尝试同时使用 scale_continuous 和 scale_discrete 因为您的设置相当笨拙,而不是简单地使用基本上用于简单情节设计的指南?
一种方法是将您的 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 个组成部分:
- 我们需要通过使用
aes()
将 something 映射到color
来欺骗 ggplot 绘制单独的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)