如何在多个子图中自动绘制同一Shapefile
优化伦敦Airbnb点位与Shapefile子图绘制的优雅实现
完全懂你的痛点——手动重复写子图绘制代码不仅冗余,要是后续子图数量变多,简直是维护噩梦!咱们可以通过配置化管理+循环遍历的方式重构代码,既减少重复逻辑,又让后续扩展变得超轻松。
重构思路
核心就是把「公共样式」和「个性化参数」分开:
- 把所有子图共用的样式(比如地图颜色、散点大小/标记)统一提取成字典,一次修改全图生效
- 把每个子图的个性化信息(标题、对应数据集、散点颜色)整理成配置列表,循环时直接读取
- 用循环自动遍历每个子图,完成地图和散点的绘制
完整优化代码
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
相关产品推荐
相关产品推荐

