You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:20:28