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

使用Matplotlib Animation绘制世界人口动图遇双图及尺寸异常的解决

解决Geopandas+Matplotlib Animation双图表及尺寸不生效问题

问题原因分析

  • 双图表问题:通常是代码中存在重复创建画布/坐标轴的操作,比如先调用gdf.plot()自动生成静态图表,后续又为动画创建新画布;或是动画初始化后额外调用plt.show()触发两次绘图流程。
  • 尺寸不生效:未在创建画布时明确绑定figsize,或是后续绘图未关联到指定尺寸的坐标轴,导致自动生成的默认尺寸画布覆盖了设置。

修正步骤

  1. 统一画布与坐标轴对象:提前创建指定尺寸的画布和坐标轴,所有绘图操作都绑定到该坐标轴,避免自动生成新画布。
  2. 移除多余静态绘图调用:不要单独执行gdf.plot(),将所有绘图逻辑放在动画的初始化和更新函数中。
  3. 控制动画显示流程:仅调用一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:35:19