
本文介绍如何将单个共享的颜色条精准置于两个并排地理热力图(choropleth)子图的正下方中央位置,解决 geopandas.plot() 默认颜色条绑定子图导致布局受限的问题。
本文介绍如何将单个共享的颜色条精准置于两个并排地理热力图(choropleth)子图的正下方中央位置,解决 `geopandas.plot()` 默认颜色条绑定子图导致布局受限的问题。
在使用 geopandas 绘制双 choropleth 子图时,plot(column=..., cmap=...) 会为每个子图自动创建独立 colorbar,且默认附着于对应子图右侧。若希望仅保留一个、居中置于整个图形底部的 colorbar(而非传统图例),需绕过 plot(..., legend=True) 的局限,改用 matplotlib.colorbar.ColorbarBase 或更推荐的 fig.colorbar() 配合 ScalarMappable 手动构造——因为 geopandas.plot() 返回的是 AxesImage 对象,可直接提取其 colormap 和 norm。
以下是完整、可复用的解决方案:
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.cm import ScalarMappable
# 原始绘图(不启用内置 legend)
a_combined_path = 'c:\mypath'
fig, (ax1, ax2) = plt.subplots(1, 2, layout='constrained')
fig.set_size_inches(10, 5.5) # 高度适当减小,为底部 colorbar 留出空间
# 绘制两个子图,返回 AxesImage 对象用于后续 colorbar 构建
im1 = a_2020.plot(ax=ax1, column='Party Vote Share', cmap='Greens',
edgecolor='black', linewidth=0.5, norm=norm, legend=False)
im2 = a_dublin.plot(ax=ax2, column='Party Vote Share', cmap='Greens',
edgecolor='black', linewidth=0.5, norm=norm, legend=False)
# 关闭坐标轴
ax1.set_axis_off()
ax2.set_axis_off()
ax1.set_title('Republic of Ireland', size=16)
ax2.set_title('Dublin', size=16)
fig.suptitle('Aontú vote share in the 2020 elections
by constituency (Pct of total vote)', size=16)
# ✅ 关键步骤:创建统一 colorbar,置于图底部中央
# 利用任一 im 的 cmap 和 norm 构造 ScalarMappable
sm = ScalarMappable(cmap='Greens', norm=norm)
sm.set_array([]) # 必须调用,否则 colorbar 报错
# 添加 colorbar:水平方向(orientation='horizontal'),底部居中
cbar = fig.colorbar(sm, ax=[ax1, ax2], shrink=0.6, aspect=30,
orientation='horizontal', pad=0.1, anchor=(0.5, 0))
cbar.set_label('Party Vote Share (%)', size=12, labelpad=10)
plt.savefig(a_combined_path, dpi=600, bbox_inches='tight')
plt.show()注意事项与技巧:
- ax=[ax1, ax2] 告知 colorbar 参考整个 figure 区域,而非单个 axes;
- shrink=0.6 控制 colorbar 宽度比例,aspect=30 调整长宽比(值越大越细长);
- pad=0.1 设置 colorbar 与子图间的垂直间距(单位为 fontsize),anchor=(0.5, 0) 确保水平居中对齐底部;
- 若需自定义刻度标签,可在 cbar 创建后调用 cbar.set_ticks([...]) 和 cbar.set_ticklabels([...]);
- 避免使用 fig.legend():它适用于分类图例(如不同类别线条/散点),而 choropleth 是连续数值映射,必须用 colorbar。
此方法完全脱离 geopandas 内置图例逻辑,灵活可控,是专业地理可视化中实现整洁布局的标准实践。

















