使用geom_path()绘制地图时共享边界透明度不均的解决方法
解决geom_path()设置alpha<1时共享边界过暗的问题
这个问题我之前也碰到过!原因很简单:当你用geom_path()绘制多个相邻多边形的边界时,两个区域共享的那条边会被各自绘制一次,叠加后的透明度就相当于两次alpha值的叠加,自然看起来比其他边界更暗。给你两个实用的解决办法:
方法一:用geom_polygon()替代geom_path()
geom_polygon()会自动处理共享边界,只绘制一次,完美解决叠加问题。我们只需要把填充色设为透明(fill = NA),就能只保留边界效果:
library(ggplot2) library(ggmap) library(maptools) library(plyr) zips <- readShapePoly('cb_2016_us_zcta510_500k.shp') zips@data$id <- rownames(zips@data) zips.points <- fortify(zips) zips.df <- join(zips.points, zips@data, by = "id") test_zips <- c(64002,64012,64013,64014,64015,64029,64030,64034,64050 ,64051,64052,64053,64054,64055,64056,64057,64063,64064,64065,64070 ,64075,64080,64081,64082,64083,64086,64108,64109,64110,64111,64112 ,64113,64114,64121,64123,64124,64125,64126,64127,64128,64129,64130 ,64131,64132,64133,64134,64136,64137,64138,64139,64141,64145,64146 ,64147,64148,64149,64170,64171,64179,64191,64198,64999,66119,66160 ,66205,66206,66207,66208,66209,66211,66222,66224,66251) Valid_Zips <- zips.df[zips.df$GEOID10 %in% test_zips,] mapImage <- get_map(location = c(lon = -94.4, lat = 38.9), color = "color", source = "google", maptype = "toner-2011", zoom = 10) # 替换为geom_polygon,设置fill为透明 ggmap(mapImage) + geom_polygon(aes(x = long, y = lat, group = group), color = "red", fill = NA, data = Valid_Zips, size = 1, alpha = .3)
方法二:提前合并多边形提取唯一边界
如果你需要单独处理边界线,可以用rgeos包先合并所有目标多边形,再提取合并后的边界(这样共享边界只会保留一次):
library(ggplot2) library(ggmap) library(maptools) library(rgeos) # 需要先安装:install.packages("rgeos") zips <- readShapePoly('cb_2016_us_zcta510_500k.shp') test_zips <- c(64002,64012,64013,64014,64015,64029,64030,64034,64050 ,64051,64052,64053,64054,64055,64056,64057,64063,64064,64065,64070 ,64075,64080,64081,64082,64083,64086,64108,64109,64110,64111,64112 ,64113,64114,64121,64123,64124,64125,64126,64127,64128,64129,64130 ,64131,64132,64133,64134,64136,64137,64138,64139,64141,64145,64146 ,64147,64148,64149,64170,64171,64179,64191,64198,64999,66119,66160 ,66205,66206,66207,66208,66209,66211,66222,66224,66251) # 筛选目标多边形并合并 zips_sub <- zips[zips$GEOID10 %in% test_zips,] zips_union <- gUnaryUnion(zips_sub) # 转换为ggplot可用的数据框 zips_union_fortify <- fortify(zips_union) mapImage <- get_map(location = c(lon = -94.4, lat = 38.9), color = "color", source = "google", maptype = "toner-2011", zoom = 10) # 绘制合并后的边界 ggmap(mapImage) + geom_path(aes(x = long, y = lat, group = group), color = "red", data = zips_union_fortify, size = 1, alpha = .3)
两种方法都能让所有边界保持一致的透明度,方法一更简单直接,适合大多数场景;方法二则适合需要对边界进行后续加工的情况。
内容的提问来源于stack exchange,提问作者Timothy
相关产品推荐
相关产品推荐

