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
相关产品推荐
相关产品推荐

