Plotly choropleth_mapbox绘制法国选举地图出现孔洞如何解决
问题根本原因
- 你调用
px.choropleth_mapbox时缺失了featureidkey参数配置。Plotly的等值区地图默认匹配逻辑是:拿locations传入的数据集字段值,去对应GeoJSON每个要素顶层的id属性做关联,不会自动检索properties下的字段。你使用的法国省界GeoJSON中,省编码存储在properties.code路径下,没有映射到要素顶层id字段,导致大量省要素匹配失败、无法渲染填充色,看起来就是地图上的孔洞。这也解释了为什么你用mapshaper打开GeoJSON显示正常(工具直接渲染所有几何图形,不做属性关联)、核查选举数据集也找不到缺失值——问题出在关联逻辑,而非数据源本身损坏。 - 少数局部孔洞的诱因是省编码格式不统一:选举数据集的
CodeDépartement列包含科西嘉地区的2A、2B这类非纯数字编码,如果读取时把两边的关联字段分别解析成了数值型、字符串型,或者存在前导零、首尾空格的差异,也会导致个别区域匹配失败。
修复方法
- 读取数据时显式指定关联字段为字符串类型,避免编码被自动转成数值导致匹配失败
- 传入
featureidkey参数,明确告诉Plotly去GeoJSON的哪个属性路径下找匹配的省编码 - 可选通过集合差集校验两边的编码值是否完全一一对应,提前排查不匹配项
修复后的可运行代码如下:
import geopandas as gpd import pandas as pd import plotly.express as px # 读取时统一指定省编码为字符串类型,避免2A/2B类编码解析错误 t1 = pd.read_csv('p2022-resultats-departement-t1.csv', dtype={'CodeDépartement': str}) geo = gpd.read_file('a-dep2021.json', dtype={'code': str}) # 可选校验:放开注释运行,输出为空则代表两边编码完全匹配 # print("选举数据存在但GeoJSON缺失的编码:", set(t1['CodeDépartement']) - set(geo['code'])) # print("GeoJSON存在但选举数据缺失的编码:", set(geo['code']) - set(t1['CodeDépartement'])) fig = px.choropleth_mapbox( t1, locations='CodeDépartement', geojson=geo, featureidkey="properties.code", # 核心配置:指定GeoJSON中用于匹配的属性路径 color='你要可视化的选举指标列名', # 替换为你实际要展示的得票率/得票数字段 mapbox_style='carto-positron', center={'lat': 47.7516, 'lon': 1.6751}, zoom=4, opacity=0.8 ) fig.update_layout(margin={'l': 10, 'r': 10, 't': 10, 'b': 10}) fig.show()
如果校验时发现存在不匹配的编码,对两列做简单的字符串清洗(去除首尾空格、统一大小写)即可解决。
内容的提问来源于stack exchange,提问作者Eccsx
相关产品推荐
相关产品推荐

