ggplot绘制地图仅显示图例,图形区域空白问题求助
问题原因
你的数据集里每个id(对应一个邦/中央直辖区)仅包含一组经纬度坐标,但geom_polygon需要每个地理区域(多边形)提供多组连续的边界坐标点才能绘制出区域形状。单个点无法构成多边形,因此绘图区域空白,仅能显示基于low_prestige生成的图例。
解决方案
要绘制正确的填充地图,需要先获取印度各邦的完整地理边界数据,再将你的统计数据与边界数据关联后绘图。以下是具体实现步骤:
1. 安装并加载必要包
install.packages(c("ggplot2", "rnaturalearth", "dplyr")) library(ggplot2) library(rnaturalearth) library(dplyr)
2. 获取印度行政区划边界数据
使用rnaturalearth包获取印度一级行政区的地理边界(包含每个区域的完整多边形坐标):
# 获取印度邦/中央直辖区的地理数据,返回sf格式(适合地理绘图) india_states <- ne_states(country = "india", returnclass = "sf") # 查看地理数据中的邦名,确保和你的数据集名称匹配(若有差异需手动修正) head(india_states$name)
3. 关联统计数据与地理数据
将你的final.plot1数据集与地理数据通过邦名关联(注意修正名称不一致的情况):
# 修正数据集内的邦名(示例:若地理数据中名称格式不同,需对应调整) final.plot1 <- final.plot1 %>% mutate(States.Uts = case_when( States.Uts == "Jammu and Kashmir" ~ "Jammu and Kashmir", States.Uts == "Andhra Pradesh" ~ "Andhra Pradesh", TRUE ~ States.Uts )) # 合并地理数据与统计数据 india_map_data <- left_join(india_states, final.plot1, by = c("name" = "States.Uts"))
4. 绘制填充地图
使用geom_sf(专门用于地理数据绘图的函数)完成绘制:
ggplot(india_map_data) + geom_sf(aes(fill = low_prestige), color = "black", linewidth = 0.3) + scale_fill_viridis_c(na.value = "gray90", name = "Low Prestige") + # 处理缺失值并设置图例名称 labs(title = "India: Low Prestige by State/UT") + theme_minimal() + theme(axis.text = element_blank(), axis.title = element_blank()) # 隐藏经纬度轴
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

