Plotly Choropleth西班牙区域显示异常问题求助
问题描述
使用Plotly绘制西班牙自治区Choropleth地图时,仅PAIS VASCO区域能正常显示图形,其余区域仅可通过hover查看名称和数值,但无图形渲染;而用Geopandas直接绘图则显示完全正常。
用户提供的Plotly代码:
import numpy as np import pandas as pd import plotly.express as px import matplotlib.pyplot as plt import numpy as np import geopandas as gpd geo_df = gpd.read_file("cc_aa.geojson") # Read geojson file with geopandas geo_df=geo_df[geo_df["acom_code"]!="20"] # Filter region that is not needed region_names =["MELILLA", "MADRID", "CATALUNA", "CEUTA ", "ANDALUCIA", "ISLAS BALEARES", "ISLAS CANARIAS", "EXTREMADURA", "REGION DE MURCIA", "COMUNIDAD VALENCIANA", "LA RIOJA", "CASTILLA Y LEON", "ARAGON", "GALICIA", "COMUNIDAD FORAL DE NAVARRA", "PRINCIPADO DE ASTURIAS", "CASTILLA-LA MANCHA", "CANTABRIA", "PAIS VASCO"] geo_df["acom_name"]= region_names # rename region names df = pd.DataFrame([(r,) for r in region_names], columns = ["acom_name"]) # Create a pandas dataframe with the regions np.random.seed(1) df["random"] = np.random.rand(19) # Add a random column which will be used in the chropleth map to set the color print(len(df)) #19 geo_df = geo_df.merge(df, on="acom_name").set_index("acom_name") # merge the geopandas df with the pandas df print(len(geo_df)) # 19 fig = px.choropleth(geo_df, geojson=geo_df.geometry,color = "random", locations=geo_df.index) fig.update_geos(fitbounds="geojson", visible=True) fig.write_html("testing_map.html")
Geopandas绘图代码:
fig, ax = plt.subplots(1, 1) geo_df.plot(column='random',ax=ax, legend=True)
GeoJSON数据来自opendatasoft平台。
问题原因
- Plotly的
px.choropleth需要接收包含所有区域特征的完整GeoJSON对象,而直接传入geo_df.geometry会将每个区域的几何对象当作独立特征,无法正确识别整体地理结构。 - 使用
locations=geo_df.index作为匹配字段时,未明确指定GeoJSON属性中对应的匹配键,导致大部分区域的数据与地理图形无法关联。
解决方法
修改Plotly代码中geojson和locations相关参数的传入方式,确保数据与地理特征正确关联:
import numpy as np import pandas as pd import plotly.express as px import geopandas as gpd geo_df = gpd.read_file("cc_aa.geojson") geo_df = geo_df[geo_df["acom_code"] != "20"] region_names = ["MELILLA", "MADRID", "CATALUNA", "CEUTA ", "ANDALUCIA", "ISLAS BALEARES", "ISLAS CANARIAS", "EXTREMADURA", "REGION DE MURCIA", "COMUNIDAD VALENCIANA", "LA RIOJA", "CASTILLA Y LEON", "ARAGON", "GALICIA", "COMUNIDAD FORAL DE NAVARRA", "PRINCIPADO DE ASTURIAS", "CASTILLA-LA MANCHA", "CANTABRIA", "PAIS VASCO"] geo_df["acom_name"] = region_names df = pd.DataFrame({"acom_name": region_names}) np.random.seed(1) df["random"] = np.random.rand(19) geo_df = geo_df.merge(df, on="acom_name") # 核心修改部分 fig = px.choropleth(geo_df, geojson=geo_df.__geo_interface__, # 传入完整的GeoJSON特征集合 color="random", locations="acom_name", # 使用数据中的匹配字段 featureidkey="properties.acom_name") # 指定GeoJSON属性中对应的匹配字段 fig.update_geos(fitbounds="geojson", visible=True) fig.write_html("testing_map.html")
关键修改说明
- 用
geo_df.__geo_interface__替代geo_df.geometry:这是GeoDataFrame的标准GeoJSON接口,包含所有区域的完整地理特征集合,符合Plotly的解析要求。 - 指定
featureidkey="properties.acom_name":明确告诉Plotly用GeoJSON属性中的acom_name字段,与数据中的acom_name进行关联,确保所有区域的图形和数据正确匹配。 - 移除
set_index("acom_name"):避免索引操作带来的匹配歧义,直接使用数据列作为关联字段更可靠。
内容的提问来源于stack exchange,提问作者NFC
相关产品推荐
相关产品推荐

