使用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
相关产品推荐
相关产品推荐

