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

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平台。


问题原因
  1. Plotly的px.choropleth需要接收包含所有区域特征的完整GeoJSON对象,而直接传入geo_df.geometry会将每个区域的几何对象当作独立特征,无法正确识别整体地理结构。
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:42