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

如何保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:39:02