R语言ggmap中使用多符号时如何保持图例颜色正确?
解决ggplot图例变黑的问题
核心原因:你在geom_point外部用if_else直接给pch赋值,而非在aes()里映射这个变量。这导致ggplot生成图例时,无法正确关联每个Zone类别对应的填充色与符号样式,默认使用的符号不支持fill参数,所以图例里的点就变成了黑色。
既然你不需要图例显示不同符号,只需要正确的颜色,我们可以通过guides()函数手动覆盖图例属性来修复。具体来说,指定fill图例的override.aes参数,把图例里的点统一设置成支持填充的符号(比如pch=21),这样填充色就能正常显示了。
修改后的代码如下:
# 加载所需包 library(ggmap) library(mapdata) library(ggplot2) # 示例数据 mapoc_temp = data.frame(longitude= c(-64.5, -63.1, -62.4, -62.2, -66.0, -61.9), latitude= c(42.7, 44.8, 45.8, 45.6, 43.0, 40.2), Zone = sample(c(1,4,6,7), 6, replace = T), location = sample(c(1,2,3), 6, replace = T)) canada = map_data("worldHires") ggplot(data = canada) + borders("world", xlim = c(-130, -60), ylim = c(20, 50), colour = "black", fill = "grey50") + geom_polygon(data = canada, aes(x=long, y = lat, group = group), fill = "grey50") + coord_sf(xlim=c(-84, -41), ylim=c(24,51), expand = FALSE) + geom_point(data = mapoc_temp, mapping = aes(x = longitude, y = latitude, fill = as.factor(Zone)), pch = if_else(mapoc_temp$location == 1,25, if_else(mapoc_temp$location == 3, 23, 21)), size = 15, colour = "black") + scale_x_continuous(label = abs) + scale_y_continuous(label = abs) + scale_fill_manual(values=c("#01579B", "#4FC3F7", "#ffa600", "#ff6361")) + # 关键修复:覆盖图例属性,使用支持填充的符号 guides(fill = guide_legend(override.aes = list(pch = 21)))
另外提个小优化:你原来的scale_color_manual图层其实是多余的,因为你把colour全局设置为黑色,并没有作为映射变量,所以可以删掉这个图层简化代码。
修改后,图例里的点会显示正确的填充颜色,同时地图上的点依然保留你设置的三种不同符号,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Kristen Cyr
相关产品推荐
相关产品推荐

