先上对比图,
第一种方法,这里仅展示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()