如何为多个GeoPandas绘图设置统一色条与颜色范围
统一GeoPandas子图的颜色范围与共享色条解决方案
要实现三个子图共用同一颜色范围和色条,核心是先确定全局数据的颜色极值,再给每个子图绑定该范围,最后基于绘图对象创建共享色条。具体修改如下:
- 计算全局颜色极值
先提取三个年份列的所有数据,算出统一的最小值和最大值,作为所有子图的颜色映射边界:
# 获取2015-2017年的所有数据,计算全局极值 all_values = result[['2015', '2016', '2017']].values.flatten() vmin = all_values.min() vmax = all_values.max()
- 修改绘图代码,绑定统一颜色范围
绘图时给每个子图指定vmin和vmax,确保颜色映射完全一致,再添加共享色条:
import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable # 创建画布和子图,统一设置整体尺寸 fig, axs = plt.subplots(ncols=3, figsize=(9, 3)) # 关闭所有子图坐标轴 for ax in axs: ax.axis('off') # 绘制子图,指定统一的颜色范围和配色 im1 = result.plot(column='2015', ax=axs[0], cmap='viridis', edgecolor="Black", linewidth=0.2, vmin=vmin, vmax=vmax) result.plot(column='2016', ax=axs[1], cmap='viridis', edgecolor="Black", linewidth=0.2, vmin=vmin, vmax=vmax) result.plot(column='2017', ax=axs[2], cmap='viridis', edgecolor="Black", linewidth=0.2, vmin=vmin, vmax=vmax) # 添加对齐的共享色条 divider = make_axes_locatable(axs[2]) cax = divider.append_axes("right", size="5%", pad=0.1) fig.colorbar(im1.collections[0], cax=cax) plt.tight_layout() plt.show()
关键说明:
- 之前用
fig.colorbar()报错,是因为GeoPandas的plot返回的是坐标轴对象,而非颜色映射所需的ScalarMappable,需要从子图的collections中提取绘图对应的PatchCollection(即im1.collections[0])作为色条的映射源。 make_axes_locatable工具可以让色条高度和子图完全对齐,避免默认布局的不协调问题。- 把
figsize放在plt.subplots()中设置,比在每个plot里重复设置更合理,避免尺寸混乱。
内容的提问来源于stack exchange,提问作者Clare
相关产品推荐
相关产品推荐

