matplotlib嵌套循环绘制3×3子图时内容重复如何解决
问题原因
你的代码存在循环逻辑错误:
- 总共只有3个国家×3个指标=9组需要绘制的内容,对应9张子图,但你写了三层循环:最内层循环会遍历全部9个
ax子图对象 - 每一组「国家+指标」的数据,都会被重复画到所有9张子图上,同时覆盖之前画的内容和子图标题
- 三层循环全部执行完后,所有子图都保留的是最后一组(最后一个国家+最后一个指标)的绘图结果,因此9张子图内容完全一致。
修正方案
去掉多余的内层遍历子图的循环,将「国家+指标」的组合和展平后的子图按顺序一一对应,保证每个子图只绘制一次对应内容即可。
修正后的可运行代码:
fig, axes = plt.subplots(3, 3, figsize=(15, 15)) flat_axes = axes.ravel() # 将3*3的二维子图数组展平为长度9的一维数组 countries = df.Country.unique() metrics = ["pre", "hum", "temp"] ax_index = 0 for country in countries: for metric in metrics: # 按索引取当前组合对应的唯一子图 current_ax = flat_axes[ax_index] # 聚合对应数据 plot_data = df[ (df.Country == country) & (df.year == 2016) ].groupby("date")[metric].mean().reset_index().sort_values("date") # 绘图 plot_data.plot( ax=current_ax, kind="line", x="date", y=metric, xlabel="" ) current_ax.set_title(f"{metric} for {country}", size=10) ax_index += 1 plt.tight_layout() # 自动调整子图间距,避免标题、坐标轴标签重叠 plt.show()
补充说明:上述代码的遍历顺序正好匹配常规布局逻辑:每行对应一个国家、每列对应一个指标,最终输出的3行3列子图完全符合需求。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

