如何使用循环优化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
相关产品推荐
相关产品推荐

