如何固定多张choropleth地图的色阶以制作对比GIF?
固定Choropleth地图色阶以实现GIF的直观视觉对比
我正在为不同时间范围制作多张choropleth地图(用于生成GIF),想了解是否有方法固定每张地图的色阶,以便进行直观的视觉对比?
我当前的代码如下:
years = range(2000, 2020) # Create the images for each year images = [] for year in years: fig, ax = plt.subplots(figsize=(10, 10)) agg.plot(column="nac_"+str(year), cmap='Blues', ax=ax, legend=True, legend_kwds={'label': f'Births in {year}'}) ax.set_title(f'Number of births in {year}') ax.set_axis_off() plt.axis('equal') plt.tight_layout() plt.savefig(f'births_{year}.png', dpi=150) plt.close() images.append(imageio.imread(f'births_{year}.png')) # Save the images as a gif imageio.mimsave('births.gif', images, fps=4)
当前输出的GIF中,色阶范围随年份变化,导致无法清晰观察各区域出生数的变化趋势。
解决方法:固定全局色阶范围
要让所有地图使用统一色阶,核心是先计算所有年份出生数据的全局极值,再通过参数强制色阶对齐:
修改后的完整代码
years = range(2000, 2020) # 计算所有年份数据的全局最小/最大值 min_val = agg[[f"nac_{year}" for year in years]].min().min() max_val = agg[[f"nac_{year}" for year in years]].max().max() images = [] for year in years: fig, ax = plt.subplots(figsize=(10, 10)) # 关键:添加vmin和vmax固定色阶范围 agg.plot(column=f"nac_{year}", cmap='Blues', ax=ax, legend=True, legend_kwds={'label': 'Number of Births'}, # 统一图例标签更直观 vmin=min_val, vmax=max_val) ax.set_title(f'Number of births in {year}') ax.set_axis_off() plt.axis('equal') plt.tight_layout() plt.savefig(f'births_{year}.png', dpi=150) plt.close() images.append(imageio.imread(f'births_{year}.png')) imageio.mimsave('births.gif', images, fps=4)
关键细节说明
- 全局极值计算:
agg[[f"nac_{year}" for year in years]]提取所有年份的出生数据列,两次min()/max()分别计算列内极值和跨列全局极值,确保色阶覆盖所有年份的数值范围 - 固定色阶参数:
vmin和vmax强制所有地图使用相同的色阶区间,同一颜色在不同年份代表相同的数值水平,完美解决趋势对比问题 - 优化图例:统一图例标签为
Number of Births,避免重复标注,让GIF视觉更简洁
内容的提问来源于stack exchange,提问作者Stwarth Piedra Bonilla
相关产品推荐
相关产品推荐

