ggplot地图标注优化:仅标注count列有数值的区域
解决方案
要解决标注混乱的问题,核心是仅对有count值的区域生成单个中心点标注,避免用多边形的所有坐标点重复标注。具体步骤如下:
1. 预处理生成标注用的中心点数据
从原数据中过滤出count不为NA的区域,再按区域名称(NAME_1)分组计算每个区域的中心点坐标(经纬度平均值):
方法1:使用dplyr(推荐)
# 若未安装dplyr先执行:install.packages("dplyr") library(dplyr) label_data <- Kenya1_df %>% filter(!is.na(count)) %>% # 过滤掉count为NA的区域 group_by(NAME_1) %>% # 按区域名称分组 summarise( long = mean(long), # 计算区域中心经度 lat = mean(lat), # 计算区域中心纬度 .groups = "drop" )
方法2:使用Base R(无需额外包)
label_data <- aggregate( cbind(long, lat) ~ NAME_1, data = Kenya1_df[!is.na(Kenya1_df$count), ], # 过滤非NA的count区域 FUN = mean # 计算中心点坐标 )
2. 修改ggplot代码添加标注
将geom_text的数据源替换为预处理后的label_data,避免重复标注和NA区域标注:
library(ggmap) library(scales) Kenya1_df <- as.data.frame(Kenya1_df) theme_opts <- list(theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank(), panel.background = element_blank(), plot.background = element_blank(), axis.line = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), plot.title = element_blank())) ggplot() + geom_polygon(data = Kenya1_df, aes(x = long, y = lat, group = group, fill = count), color = "black", size = 0.25) + theme(aspect.ratio=1) + scale_fill_distiller(name="Count", palette = "Reds", breaks = pretty_breaks(n = 5)) + # 使用预处理的中心点数据,仅标注有count的区域 geom_text(data = label_data, aes(x = long, y = lat, label = NAME_1), size = 3) + labs(title="Nice Map") + theme_opts # 应用自定义主题
问题根源解释
原代码直接用Kenya1_df作为geom_text的数据源,而多边形数据是由多个坐标点组成单个区域的,这会导致每个区域被重复标注数十次;同时未过滤count为NA的区域,进一步加剧了混乱。通过预处理生成每个区域的唯一中心点,就能避免这些问题。
内容的提问来源于stack exchange,提问作者LivingstoneM
相关产品推荐
相关产品推荐

