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

如何在多个子图中自动绘制同一Shapefile

优化伦敦Airbnb点位与Shapefile子图绘制的优雅实现

完全懂你的痛点——手动重复写子图绘制代码不仅冗余,要是后续子图数量变多,简直是维护噩梦!咱们可以通过配置化管理+循环遍历的方式重构代码,既减少重复逻辑,又让后续扩展变得超轻松。

重构思路

核心就是把「公共样式」和「个性化参数」分开:

  1. 把所有子图共用的样式(比如地图颜色、散点大小/标记)统一提取成字典,一次修改全图生效
  2. 把每个子图的个性化信息(标题、对应数据集、散点颜色)整理成配置列表,循环时直接读取
  3. 用循环自动遍历每个子图,完成地图和散点的绘制

完整优化代码

import geopandas as gpd
import matplotlib.pyplot as plt

# 保留你的Shapefile读取逻辑
londonshp = gpd.read_file("statistical-gis-boundaries london\ESRI\London_Borough_Excluding_MHW.shp")
londonshp = londonshp.to_crs(4326)

# --------------------------
# 1. 定义公共样式:统一管理重复属性
# --------------------------
COMMON_MAP_STYLE = {
    'color': '#e0e1dd',
    'edgecolor': '#1c1c1c'
}
COMMON_SCATTER_STYLE = {
    's': 1,
    'marker': '.'
}

# --------------------------
# 2. 整理子图配置:把个性化信息集中管理
# 后续加新子图?直接在列表里加个字典就行!
# --------------------------
subplot_configs = [
    {
        'title': "Entire Homes/Apts",
        'dataset': entirehomedf,
        'scatter_color': '#2ec4b6'
    },
    {
        'title': "Private Rooms",
        'dataset': privateroomdf,
        'scatter_color': '#ff9f1c'
    }
]

# --------------------------
# 3. 循环自动化绘制子图
# --------------------------
# 根据配置数量自动生成子图布局
n_plots = len(subplot_configs)
fig, axes = plt.subplots(ncols=n_plots, figsize=(12, 16))

# 遍历每个轴和对应的配置
for ax, config in zip(axes, subplot_configs):
    # 绘制伦敦地图(应用公共样式)
    londonshp.plot(ax=ax, **COMMON_MAP_STYLE)
    # 绘制散点(公共样式 + 个性化颜色)
    ax.scatter(
        config['dataset'].longitude,
        config['dataset'].latitude,
        c=config['scatter_color'],
        **COMMON_SCATTER_STYLE
    )
    # 设置子图公共属性
    ax.set_aspect('equal')
    ax.set_yticklabels([])
    ax.set_xticklabels([])
    ax.set_title(config['title'])

# 自动调整子图间距,避免标题/元素重叠
plt.tight_layout()
plt.show()

额外扩展提示

如果后续子图数量变多(比如要加「Shared Rooms」类别),只需要在subplot_configs里新增一个字典:

subplot_configs.append({
    'title': "Shared Rooms",
    'dataset': sharedroomdf,
    'scatter_color': '#e71d36'
})

甚至改成网格布局(比如2行2列)也完全不用改循环逻辑,只需要调整plt.subplots的参数,然后用axes.flat遍历二维轴数组:

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(16, 12))
for ax, config in zip(axes.flat, subplot_configs):
    # 绘图逻辑和之前完全一致
    ...

内容的提问来源于stack exchange,提问作者Anja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:12:34