如何保留Pandas循环绘图过程中生成的所有历史图表?
问题原因
pandas绘图基于matplotlib实现,默认会复用当前活跃的画布对象,所以循环中每次调用plot方法都会覆盖上一张图的内容,最终仅最后一张图保留。
解决方法
方法1:循环内单张依次显示
每画完一张图就调用plt.show()展示,直接生成独立的图表窗口:
import matplotlib.pyplot as plt import numpy as np import pandas as pd for col in X_train.columns: if "ThreeMonthAvg" in col: X_train[col] = pd.cut(X_train[col], bins=[-np.inf, 0, 100, 500, 1000, 2000, 4000, np.inf]) print(col) X_train[col].value_counts().plot.bar() plt.show()
方法2:批量保存到本地文件
不需要弹窗展示的话,可以直接按列名存储为本地图片,每次存完清空画布:
import matplotlib.pyplot as plt for col in X_train.columns: if "ThreeMonthAvg" in col: X_train[col] = pd.cut(X_train[col], bins=[-np.inf, 0, 100, 500, 1000, 2000, 4000, np.inf]) print(col) X_train[col].value_counts().plot.bar() plt.savefig(f"{col}_频率分布图.png", bbox_inches='tight') plt.clf() # 清空当前画布,避免下一张图重叠
方法3:所有图排列在同一张画布
如果需要集中查看所有特征的分布,可以提前创建子图网格,把所有图画在同一个大画布上:
import matplotlib.pyplot as plt # 先筛选目标列 target_cols = [col for col in X_train.columns if "ThreeMonthAvg" in col] col_num = len(target_cols) # 按2列排布子图,可根据需求调整行列数 row_num = (col_num + 1) // 2 fig, axes = plt.subplots(row_num, 2, figsize=(14, 5 * row_num)) axes = axes.flatten() # 把子图数组平铺方便遍历 for idx, col in enumerate(target_cols): X_train[col] = pd.cut(X_train[col], bins=[-np.inf, 0, 100, 500, 1000, 2000, 4000, np.inf]) X_train[col].value_counts().plot.bar(ax=axes[idx], title=f"{col} 频率分布") # 隐藏多余的空子图 for ax in axes[col_num:]: ax.set_visible(False) plt.tight_layout() # 自动调整布局避免文字重叠 plt.show()
如果在Jupyter Notebook环境运行,建议先执行%matplotlib inline魔法命令,确保图表可以正常内嵌展示。
内容的提问来源于stack exchange,提问作者Jon Nguyen
相关产品推荐
相关产品推荐

