使用Matplotlib Animation绘制世界人口动图遇双图及尺寸异常的解决
解决Geopandas+Matplotlib Animation双图表及尺寸不生效问题
问题原因分析
- 双图表问题:通常是代码中存在重复创建画布/坐标轴的操作,比如先调用
gdf.plot()自动生成静态图表,后续又为动画创建新画布;或是动画初始化后额外调用plt.show()触发两次绘图流程。 - 尺寸不生效:未在创建画布时明确绑定
figsize,或是后续绘图未关联到指定尺寸的坐标轴,导致自动生成的默认尺寸画布覆盖了设置。
修正步骤
- 统一画布与坐标轴对象:提前创建指定尺寸的画布和坐标轴,所有绘图操作都绑定到该坐标轴,避免自动生成新画布。
- 移除多余静态绘图调用:不要单独执行
gdf.plot(),将所有绘图逻辑放在动画的初始化和更新函数中。 - 控制动画显示流程:仅调用一次
plt.show()(或动画对象的show()方法)展示动画,避免重复触发绘图。
修正后的完整代码
import geopandas as gpd import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 加载世界地图数据(替换为你的实际数据路径) world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) # 假设数据包含各年份人口列,格式为pop_2000、pop_2001...pop_2020 years = [str(year) for year in range(2000, 2021)] pop_columns = [f'pop_{year}' for year in years] # 提前创建指定尺寸的画布和坐标轴 fig, ax = plt.subplots(figsize=(15, 5)) def init(): # 初始化坐标轴,绘制地图边界 ax.clear() world.boundary.plot(ax=ax, linewidth=0.5, color='black') return ax, def update(year_idx): ax.clear() current_year = years[year_idx] current_pop_col = pop_columns[year_idx] # 绘制当前年份人口地图,绑定到指定坐标轴 world.plot(column=current_pop_col, ax=ax, cmap='YlOrRd', legend=True, legend_kwds={'shrink': 0.5}) ax.set_title(f'World Population Distribution - {current_year}') world.boundary.plot(ax=ax, linewidth=0.5, color='black') return ax, # 创建动画对象 ani = FuncAnimation(fig, update, frames=len(years), init_func=init, interval=500, blit=True) # 仅调用一次展示函数 plt.show()
关键细节说明
- 绑定尺寸到画布:通过
plt.subplots(figsize=(15,5))创建固定尺寸的画布,后续所有plot操作通过ax=ax参数关联到该坐标轴,确保尺寸设置生效。 - 集中绘图逻辑:所有地图绘制逻辑都放在
init和update函数中,避免单独调用world.plot()生成额外静态图表。 - 单一显示入口:仅保留一次
plt.show(),确保只触发一次绘图流程,避免生成双图表。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

