在pandas中使matplotlib动态画子图的两种方法【推荐gridspec】

先上对比图,

第一种方法,这里仅展示1个大区,多个的话需要加一层循环就可以了,主要是看子图的画法

当大区下面的国家为1个或2个时,会进行报错

# 获取非洲国家列表
african_countries = df[df['大区'] == '南亚大区']['进口国'].unique()

# 动态计算子图的行列数量
num_countries = len(african_countries)
rows = (num_countries + 2) // 3  # 计算行数
cols = min(3, num_countries)  # 最多3列

# 创建包含子图的图形
fig, axes = plt.subplots(rows, cols, figsize=(15, 8))
fig.suptitle('南亚大区不同国家进口金额月度变化趋势', fontsize=16, fontweight='bold')

# 循环绘制子图
for i, country in enumerate(african_countries):
    row, col = divmod(i, cols)
    ax = axes[row, col]
    
    # 按国家和月份对金额进行汇总
    monthly_sum = (df[(df['大区'] == '南亚大区') & (df['进口国'] == country)].groupby('月份')['金额'].sum() / 10000).round(1)
    
    # 绘制折线图
    ax.plot(monthly_sum.index, monthly_sum.values, marker='o', linestyle='-')
    ax.set_title(f'{country}进口金额月度变化趋势')
    ax.set_xlabel('月份')
    ax.set_ylabel('金额(万美元)')
    ax.grid(False)
    ax.tick_params(axis='x', rotation=45)

# 调整子图布局
plt.tight_layout(rect=[0, 0.03, 1, 0.95])

# 显示图形
plt.show()

第二种方法,这个可以动态的对数量进行调整,并不会出现空子图,仅有个框存在

# 不同大洲的列表
continents = ['北美大区', '拉美大区', '中东非大区', '南亚大区', '新亚太大区', '东欧大区', '西欧大区', '独联体大区', '东南亚大区']
for continent in continents:
    # 获取非洲国家列表
    african_countries = df[df['大区'] == continent]['进口国'].unique()

    # 动态计算子图的行列数量
    num_countries = len(african_countries)
    rows = (num_countries + 2) // 3  # 计算行数
    cols = min(3, num_countries)  # 最多3列

    # 创建包含子图的图形
    fig = plt.figure(figsize=(15, rows * 3.5))
    fig.suptitle(f'{continent}国家进口金额月度变化趋势', fontsize=16, fontweight='bold')
    gs = fig.add_gridspec(rows, cols)

    # 循环绘制子图
    for i, country in enumerate(african_countries):
        row, col = divmod(i, cols)
        ax = fig.add_subplot(gs[row, col])

        # 按国家和月份对金额进行汇总
        monthly_sum = (df[(df['大区'] == continent) & (df['进口国'] == country)].groupby('月份')['金额'].sum() / 10000).round(1)

        # 绘制折线图
        ax.plot(monthly_sum.index, monthly_sum.values, marker='o', linestyle='-')
        ax.set_title(f'{country}进口金额月度变化趋势')
        ax.set_xlabel('月份')
        ax.set_ylabel('金额(万美元)')
        ax.grid(False)
        ax.tick_params(axis='x', rotation=45)

    # 调整子图布局
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])

    # 显示图形
    plt.show()

你可能感兴趣的:(数据分析,pandas,matplotlib)