Python中直方图绘制-保存-关闭异常问题求助
解决Pandas直方图保存为空及窗口无法关闭的问题
问题原因分析
- 空图问题:原代码中
df.hist()会自动创建新的Figure对象,和你提前定义的fig_verify完全无关,最后保存fig_verify自然是空文件;且你在关闭窗口后才执行保存操作,此时绘图资源已被释放。 - 窗口无法关闭:
plt.close()默认仅关闭当前活跃的Figure,若存在多个Figure实例(比如手动创建的fig_verify和df.hist()生成的),会残留未关闭的窗口。
修正方案(两种可选)
方案一:指定绘图的Axes对象(推荐)
手动创建Figure和Axes,让直方图绘制在指定的画布上,确保保存的是正确的图:
import pandas as pd import matplotlib.pyplot as plt # 创建数据 data = {'Marks': [22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27]} # 转为DataFrame df = pd.DataFrame(data) # 同时创建Figure和Axes,指定画布尺寸 fig_verify, ax = plt.subplots(figsize=(15,5)) # 让直方图绘制在指定的Axes上 df['Marks'].hist(grid=False, edgecolor='blue', bins=100, ax=ax) # 先保存图片(绘图完成后立即保存,避免窗口关闭后资源释放) fig_verify.savefig("hist.png") # 显示窗口并设置自动关闭 plt.show(block=False) plt.pause(1) # 关闭所有绘图窗口,确保无残留 plt.close('all')
方案二:获取直方图所属的Figure
直接从df.hist()返回的Axes对象中获取对应的Figure进行保存:
import pandas as pd import matplotlib.pyplot as plt data = {'Marks': [22, 87, 5, 43, 56, 73, 55, 54, 11, 20, 51, 5, 79, 31, 27]} df = pd.DataFrame(data) # 绘制直方图,返回的是Axes二维数组(单列数据取[0][0]) ax = df.hist(grid=False, edgecolor='blue', bins=100, figsize=(15,5))[0][0] # 获取该Axes所属的Figure fig = ax.get_figure() # 保存图片 fig.savefig("hist.png") # 显示并关闭窗口 plt.show(block=False) plt.pause(1) plt.close('all')
关键改动点
- 确保直方图绘制在你要保存的Figure对象上,避免出现"创建空画布+单独生成绘图"的分离情况。
- 调整操作顺序:先保存图片,再关闭窗口,防止窗口关闭后绘图资源被销毁。
- 使用
plt.close('all')替代默认的plt.close(),确保所有绘图窗口都被彻底关闭。
内容的提问来源于stack exchange,提问作者NN_Developer
相关产品推荐
相关产品推荐

