使用Plotly choropleth_mapbox动画时未显示全部离散值求助
问题排查与解决思路
核心原因推测及验证步骤
- 部分年份缺失离散值:尽管你确认年份和Code列有数据,但某个年份的
Range de veillisement可能只包含2个取值。Plotly动画会基于全局图例展示,若某一年缺失某个值,图例就会隐藏该类别。用以下代码快速验证:
# 查看各年份的离散值数量 print(df_FR_1.groupby('Year')['Range de veillisement'].nunique()) # 查看每个年份的具体取值分布 for year in df_FR_1['Year'].unique(): print(f"Year {year}: {df_FR_1[df_FR_1['Year']==year]['Range de veillisement'].unique()}")
- 数据类型或格式不一致:
Range de veillisement字段可能存在隐形格式差异(比如空格、大小写不同,或混合字符串/数值类型),导致Plotly将同一类别识别为不同项。检查数据一致性:
# 查看所有离散值的计数,确认是否存在异常项 print(df_FR_1['Range de veillisement'].value_counts()) # 检查字段数据类型 print(df_FR_1['Range de veillisement'].dtype)
- 地理编码匹配失效:部分年份的
Code值可能与geojson中的properties.code不匹配,导致对应区域无法渲染,进而让该年份的离散值未被纳入全局统计。验证匹配情况:
# 提取geojson中的所有有效编码 geo_codes = [feat['properties']['code'] for feat in geo_reg['features']] # 检查各年份是否存在未匹配的编码 for year in df_FR_1['Year'].unique(): unmatched = df_FR_1[df_FR_1['Year']==year]['Code'].loc[~df_FR_1[df_FR_1['Year']==year]['Code'].isin(geo_codes)] if len(unmatched) > 0: print(f"Year {year} 未匹配编码: {unmatched.tolist()}")
- Plotly版本bug:旧版Plotly在处理离散值动画时存在兼容性问题,尝试升级到最新版:
pip install --upgrade plotly
快速修复方案
如果确认是部分年份缺失离散值导致的问题,可以手动指定category_orders参数,强制Plotly保留所有3个离散值的图例:
px.choropleth_mapbox(df_FR_1, geojson = geo_reg, locations = 'Code', color = 'Range de veillisement', featureidkey="properties.code", mapbox_style="white-bg", center = {'lat': 46.5, 'lon': -0.1}, zoom = 4.1, animation_frame = 'Year', # 替换为你的3个离散值实际内容 category_orders={'Range de veillisement': ['离散值1', '离散值2', '离散值3']} )
内容的提问来源于stack exchange,提问作者Jorge Mariano Mamani Soria
相关产品推荐
相关产品推荐

