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

如何使用循环优化Matplotlib与Seaborn多子图散点图的绘制效率

如何使用循环优化Matplotlib与Seaborn多子图散点图的绘制效率

我完全懂你现在的困扰——手动写六张子图的代码虽然能出效果,但重复代码太多,想用循环简化却踩了坑,结果每次循环都只在第一个子图位置画图,还生成了好多个单独的图表对吧?

先看看你原来手动实现的代码,逻辑没问题就是太繁琐:

plt.subplot(2, 3, 1)
sns.scatterplot(data = chile, x = 'Year', y = 'Life expectancy at birth (years)')
plt.title('Chile')

plt.subplot(2, 3, 2)
sns.scatterplot(data = china, x = 'Year', y = 'Life expectancy at birth (years)')
plt.title('China')

plt.subplot(2, 3, 3)
sns.scatterplot(data = germany, x = 'Year', y = 'Life expectancy at birth (years)')
plt.title('Germany')

plt.subplot(2, 3, 4)
sns.scatterplot(data = mexico, x = 'Year', y = 'Life expectancy at birth (years)')
plt.title('Mexico')

plt.subplot(2, 3, 5)
sns.scatterplot(data = usa, x = 'Year', y = 'Life expectancy at birth (years)')
plt.title('United States of America')

plt.subplot(2, 3, 6)
sns.scatterplot(data = zimbabwe, x = 'Year', y = 'Life expectancy at birth (years)')
plt.title('Zimbabwe')

plt.subplots_adjust(wspace = 0.5, hspace = 0.5)
plt.show()
plt.clf()

咱们来分析下你循环写法的问题:

  • 你把plot_number = 1放在了循环内部,这就导致每次循环都会把计数器重置为1,所有图都挤到第一个子图位置上了;
  • 每次循环都调用plt.show()和plt.clf(),这会直接显示当前图并清空画布,所以每次循环都是一个独立的新图表,根本没在同一个大画布的不同子图里绘制。

下面给你两种优化的循环写法,都能解决问题:

方法一:修正计数器逻辑的基础写法

把数据和对应的标题配对成列表,计数器放在循环外面,统一最后处理显示和清空:

# 把数据和对应国家标题配对,循环时能同时拿到数据和标题,更清晰
country_info = [
    (chile, 'Chile'),
    (china, 'China'),
    (germany, 'Germany'),
    (mexico, 'Mexico'),
    (usa, 'United States of America'),
    (zimbabwe, 'Zimbabwe')
]

# 计数器放在循环外,从1开始计数子图位置
plot_number = 1

for data, title in country_info:
    plt.subplot(2, 3, plot_number)
    sns.scatterplot(data=data, x='Year', y='Life expectancy at birth (years)')
    plt.title(title)
    # 每次循环计数器加1,切换到下一个子图位置
    plot_number += 1

# 所有子图绘制完成后,统一调整间距、显示和清空画布
plt.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()
plt.clf()

方法二:更直观的子图数组写法

用plt.subplots()直接创建子图数组,展平后遍历,代码可读性更强,还能方便调整画布大小:

import matplotlib.pyplot as plt
import seaborn as sns

country_info = [
    (chile, 'Chile'),
    (china, 'China'),
    (germany, 'Germany'),
    (mexico, 'Mexico'),
    (usa, 'United States of America'),
    (zimbabwe, 'Zimbabwe')
]

# 创建2行3列的子图布局,指定画布大小让图表更美观
fig, axes = plt.subplots(2, 3, figsize=(12, 8))

# 把二维的子图数组展平成一维,方便循环遍历
for ax, (data, title) in zip(axes.flat, country_info):
    sns.scatterplot(data=data, x='Year', y='Life expectancy at birth (years)', ax=ax)
    ax.set_title(title)
    # 可选:旋转x轴标签避免重叠
    ax.tick_params(axis='x', rotation=45)

# 调整子图间距
plt.subplots_adjust(wspace=0.5, hspace=0.5)
plt.show()
plt.clf()

备注:内容来源于stack exchange,提问作者Martin Espino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:24:34