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

使用Python Basemap绘制城市收入热力图遇ValueError错误求助

问题排查与修复

核心错误原因

你遇到的ValueError: not enough values to unpack (expected 2, got 1)及绘图失败,由以下几个关键问题导致:

1. 未定义变量导致数据缺失

代码中count =(int)(basedict[i])里的basedict是未定义变量,应替换为你实际的城市收入字典j。这个错误会触发except分支,导致部分城市的收入数据无法存入con列表,最终lat、lon、con三个列表长度不一致,后续数组处理和绘图时出现维度不匹配。

2. 地理坐标未转换为数值类型

geopy返回的lat和lon是字符串格式,直接存入列表转成数组后是字符串数组,无法被Basemap正确处理。

3. 错误使用meshgrid和pcolormesh

meshgrid用于生成网格数据,适合绘制连续区域热力图,但你的数据是离散城市点的收入值,应该用散点图(scatter)映射收入,而非pcolormesh。强行用meshgrid会把一维经纬度转成二维数组,而收入数据仍是一维,维度不匹配引发错误。

修复后的完整代码

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from geopy.geocoders import Nominatim

# 城市-收入字典
city_income = {'Aach': 38.0, 'Aachen': 380.0, 'Aalen': 348.0, 'Aalen-Waldhausen': 10.0, 'Aarbergen': 17.0, 'Abenberg': 2.0, 'Abstatt': 6.0}

lat_list = []
lon_list = []
income_list = []

geolocator = Nominatim(user_agent="geoapiExercises")

for city, income in city_income.items():
    location = geolocator.geocode(city)
    if not location:
        print(f"无法找到城市 {city} 的地理信息")
        continue
    try:
        # 提取经纬度并转为数值类型
        lat = float(location.raw["lat"])
        lon = float(location.raw["lon"])
        lat_list.append(lat)
        lon_list.append(lon)
        income_list.append(income)
    except KeyError as e:
        print(f"城市 {city} 的地理数据缺少字段: {e}")
        continue

# 转为numpy数组
lat = np.array(lat_list)
lon = np.array(lon_list)
incomes = np.array(income_list)

fig = plt.figure(figsize=(10, 8))
# 初始化Basemap,调整投影参数适配欧洲区域
m = Basemap(projection='lcc', resolution='c',
            width=2.5E6, height=2.5E6, 
            lat_0=51, lon_0=9,)  # 中心设为德国附近

m.shadedrelief(scale=0.5)
# 绘制散点图,用点的大小映射收入值(可根据需求调整缩放比例)
scatter = m.scatter(lon, lat, s=incomes*2, c=incomes, latlon=True, cmap='RdBu_r', alpha=0.7)
# 添加颜色条
plt.colorbar(scatter, label='聚合收入值')
plt.title('欧洲城市聚合收入分布')
plt.show()

关键修复点说明

  • 替换未定义的basedict为实际字典city_income(原j,重命名提高可读性),同时用items()遍历键值对,避免单独取收入时出错。
  • 将经纬度字符串转为float类型,确保数值计算正常。
  • 移除错误的meshgrid,改用scatter绘制离散点,通过s参数控制点的大小、c参数控制颜色,直观映射收入值。
  • 调整Basemap的宽度、高度和中心坐标,更适配你的德国城市数据,提升绘图效果。
  • 增加错误提示,方便排查无法获取地理信息的城市。

内容的提问来源于stack exchange,提问作者Andi Maier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:50:41