使用Matplotlib绘制全国选区得票率地图及首都局部放大图的问题
解决Matplotlib地图局部放大图颜色标尺匹配全国数据的问题
问题背景
已通过Matplotlib绘制全国政党选区得票率地图,需添加都柏林区域局部放大图优化可读性,但当前局部图的颜色标尺基于都柏林本地数据,无法与全国数据的颜色映射保持一致,导致对比混乱。
使用的原始代码:
a_combined_path = 'c:\my_path' fig, (ax1, ax2) = plt.subplots(1, 2) fig.set_size_inches(10,10) a_2020.plot(ax=ax1, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth = 0.5) a_dublin.plot(ax=ax2, column='Party Vote Share', cmap='Greens', legend=True, edgecolor='black', linewidth = 0.5) ax1.set_axis_off() ax2.set_axis_off() fig.suptitle('Aontú vote share in the 2020 elections\nby constituency (Pct of total vote)', size = 16) plt.savefig(a_combined_path, dpi=600)
核心解决方案
通过统一颜色映射的极值范围,强制局部图使用全国数据的vmin(最小值)和vmax(最大值),确保颜色标尺完全对齐。同时优化布局和图例,提升整体美观性。
修改后的完整代码
a_combined_path = r'c:\my_path' # 用raw字符串避免路径转义问题 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) # 调整画布比例更协调 # 计算全国范围的得票率极值,作为统一颜色标尺的基准 vote_min = a_2020['Party Vote Share'].min() vote_max = a_2020['Party Vote Share'].max() # 绘制全国地图,绑定统一颜色范围 a_2020.plot(ax=ax1, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth=0.5, vmin=vote_min, vmax=vote_max) # 绘制都柏林局部图,使用完全相同的颜色范围,图例放在局部图上 dublin_plot = a_dublin.plot(ax=ax2, column='Party Vote Share', cmap='Greens', edgecolor='black', linewidth=0.5, vmin=vote_min, vmax=vote_max, legend=True, legend_kwds={'shrink': 0.8}) # 调整图例大小适配子图 # 关闭坐标轴,保持地图简洁 ax1.set_axis_off() ax2.set_axis_off() # 设置标题,调整位置避免被裁剪 fig.suptitle('Aontú 2020年选举得票率\n按选区统计(占总票数百分比)', size=16, y=1.02) # 保存图片,确保标题和图例完整保留 plt.savefig(a_combined_path, dpi=600, bbox_inches='tight')
关键调整说明
- 统一颜色范围:通过
vmin和vmax参数,让两个子图共享全国数据的得票率极值,彻底解决局部图标尺独立的问题,颜色与全国数据完全对应。 - 路径与布局优化:用raw字符串处理文件路径避免转义错误;调整
figsize让左右布局更舒展,避免正方形画布的拥挤感。 - 图例与细节:通过
legend_kwds调整图例大小;bbox_inches='tight'确保保存图片时标题和图例不被裁剪。
进阶优化:标记局部图对应位置(可选)
若需更清晰的关联,可在全国地图上用红色框标记都柏林区域:
# 获取都柏林选区的边界坐标 dublin_bounds = a_dublin.total_bounds # 在全国地图上添加红色边框标记都柏林范围 ax1.add_patch(plt.Rectangle((dublin_bounds[0], dublin_bounds[1]), dublin_bounds[2]-dublin_bounds[0], dublin_bounds[3]-dublin_bounds[1], fill=False, edgecolor='red', linewidth=2))
内容的提问来源于stack exchange,提问作者Nick Seymour
相关产品推荐
相关产品推荐

