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

Matplotlib:如何将图例放置在两个Choropleth子图下方?

解决方案

方法1:共享水平色条置于子图下方中心

因为两个子图使用了相同的norm和cmap,可以创建一个共享的水平色条,放在子图正下方。修改代码如下:

import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable

a_combined_path = r'c:\mypath'  # 用原始字符串避免路径转义问题
fig, (ax1, ax2) = plt.subplots(1,2, layout='constrained')
fig.set_size_inches(10,10)

# 绘制子图
a_2020.plot(ax=ax1, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth=0.5, norm=norm)
a_dublin.plot(ax=ax2, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth=0.5, norm=norm)

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\nby constituency (Pct of total vote)', size=16)

# 创建用于色条的映射对象
sm = ScalarMappable(norm=norm, cmap='Greens')
sm.set_array([])  # 仅需映射规则,无需绑定数据

# 添加水平色条,关联两个子图并调整位置
cbar = fig.colorbar(sm, ax=[ax1, ax2], orientation='horizontal', pad=0.05, shrink=0.8)
cbar.set_label('Party Vote Share (%)', size=12)

plt.savefig(a_combined_path, dpi=600)
plt.show()

关键说明:

  • 手动创建ScalarMappable对象,适配geopandas绘图的颜色映射规则,解决无法直接从plot结果提取色条数据源的问题。
  • ax=[ax1, ax2]指定色条关联两个子图,orientation='horizontal'设置为水平方向,pad控制色条与子图的间距,shrink调整色条宽度使其居中适配子图总宽度。

方法2:使用离散图例(非色条)

如果偏好离散样式的图例,可以手动创建图例元素并放置在子图下方:

import matplotlib.pyplot as plt
from matplotlib.patches import Patch

a_combined_path = r'c:\mypath'
fig, (ax1, ax2) = plt.subplots(1,2, layout='constrained')
fig.set_size_inches(10,10)

# 绘制子图
a_2020.plot(ax=ax1, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth=0.5, norm=norm)
a_dublin.plot(ax=ax2, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth=0.5, norm=norm)

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\nby constituency (Pct of total vote)', size=16)

# 根据你的数据区间自定义图例色块和标签
legend_elements = [
    Patch(facecolor='darkgreen', edgecolor='black', label='0-10%'),
    Patch(facecolor='limegreen', edgecolor='black', label='10-20%'),
    Patch(facecolor='lightgreen', edgecolor='black', label='20-30%')
]

# 将图例放在下方中心位置
fig.legend(handles=legend_elements, loc='lower center', ncol=3, bbox_to_anchor=(0.5, -0.05), fontsize=12)

# 调整底部布局避免图例被截断
fig.subplots_adjust(bottom=0.15)

plt.savefig(a_combined_path, dpi=600, bbox_inches='tight')
plt.show()

关键说明:

  • 用Patch创建对应区间的图例色块,颜色和标签可根据实际数据区间调整。
  • loc='lower center'和bbox_to_anchor=(0.5, -0.05)控制图例在图的下方中心,ncol设置列数让图例横向排列,bbox_inches='tight'确保保存时图例不被截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:12:08