求助:如何将意大利企业数据生成地理可视化(含Choropleth Map)
实现意大利省/大区Choropleth地图的可行方案
核心思路
先从SQL提取按省/大区聚合的统计数据(比如企业数量、记录数),再结合意大利地理边界数据,用Python的地理可视化库生成Choropleth地图。以下是两种落地性强的方案:
方案1:Plotly(交互式地图,推荐)
Plotly的Choropleth支持直接调用内置地理数据或自定义GeoJSON,交互性强,适合团队展示。
步骤1:从SQL提取聚合数据
用Python连接你的SQL数据库,提取按Provincia或Regione分组的统计值:
import pandas as pd import psycopg2 # PostgreSQL用这个,SQLite用sqlite3,MySQL用pymysql,按需替换 # 连接数据库(示例为PostgreSQL) conn = psycopg2.connect( dbname="你的数据库名", user="用户名", password="密码", host="localhost" ) # 按大区聚合的查询 query_regione = """ SELECT Regione, COUNT(*) as count FROM 你的表名 GROUP BY Regione """ df_regione = pd.read_sql(query_regione, conn) # 按省聚合的查询 query_provincia = """ SELECT Provincia, COUNT(*) as count FROM 你的表名 GROUP BY Provincia """ df_provincia = pd.read_sql(query_provincia, conn) conn.close()
步骤2:生成大区Choropleth地图
Plotly内置意大利大区地理匹配能力,直接用名称关联即可:
import plotly.express as px fig_regione = px.choropleth( df_regione, locations="Regione", locationmode="country names", color="count", scope="europe", title="意大利大区企业分布", color_continuous_scale="YlOrRd", hover_name="Regione" ) # 聚焦意大利区域,隐藏多余地图元素 fig_regione.update_geos(fitbounds="locations", visible=False) fig_regione.show()
步骤3:生成省级Choropleth地图
省级需要加载自定义GeoJSON(提前下载意大利省边界数据保存到本地):
import json # 加载本地GeoJSON文件 with open("italy_provinces.geojson") as f: italy_provinces_geo = json.load(f) fig_provincia = px.choropleth( df_provincia, geojson=italy_provinces_geo, locations="Provincia", featureidkey="properties.name", # 匹配GeoJSON中的省名字段 color="count", title="意大利省级企业分布", color_continuous_scale="YlOrRd", hover_name="Provincia" ) fig_provincia.update_geos(fitbounds="locations", visible=False) fig_provincia.show()
方案2:GeoPandas + Matplotlib(静态地图,适合报告)
GeoPandas擅长处理地理数据,可生成高精度静态图,方便导出为图片/PDF。
步骤1:准备数据
先提取聚合数据,再加载意大利地理边界Shapefile:
import geopandas as gpd import matplotlib.pyplot as plt # 加载意大利大区/省的Shapefile(提前下载到本地) gdf_regioni = gpd.read_file("italy_regions.shp") gdf_province = gpd.read_file("italy_provinces.shp") # 合并聚合数据与地理数据(确保名称字段匹配,比如gdf_regioni的"NAME"对应df_regione的"Regione") gdf_regioni_merged = gdf_regioni.merge(df_regione, left_on="NAME", right_on="Regione", how="left") gdf_province_merged = gdf_province.merge(df_provincia, left_on="NAME", right_on="Provincia", how="left")
步骤2:绘制静态Choropleth地图
# 大区地图 fig, ax = plt.subplots(1, 1, figsize=(12, 8)) gdf_regioni_merged.plot( column="count", cmap="YlOrRd", linewidth=0.8, ax=ax, edgecolor="white", legend=True, legend_kwds={"label": "企业数量", "orientation": "horizontal"} ) ax.set_title("意大利大区企业分布") ax.axis("off") plt.savefig("italy_regions_choropleth.png", dpi=300) # 省级地图 fig, ax = plt.subplots(1, 1, figsize=(12, 8)) gdf_province_merged.plot( column="count", cmap="YlOrRd", linewidth=0.8, ax=ax, edgecolor="white", legend=True, legend_kwds={"label": "企业数量", "orientation": "horizontal"} ) ax.set_title("意大利省级企业分布") ax.axis("off") plt.savefig("italy_provinces_choropleth.png", dpi=300)
关键注意事项
- 名称匹配:确保你的数据中
Provincia/Regione的拼写和地理数据中的名称完全一致(比如重音、大小写差异),不一致的话用str.replace()或映射表统一。 - 地理数据来源:可下载免费的意大利省/大区边界数据(Shapefile/GeoJSON格式),优先选官方或权威开源数据源。
- 数据聚合:Choropleth需要数值型统计数据,必须先按地理区域聚合,不能直接用原始单条记录。
内容的提问来源于stack exchange,提问作者sickboy83
相关产品推荐
相关产品推荐

