关于保存图片时出现的<Figure size 800x550 with 0 Axes>以及保存图片空白的完美解决

作者分享了解决在使用SHAP库绘制热图时,保存图片空白的问题,原因是plt.show()调用在plt.savefig()之前。通过设置`show=False`解决了问题,同时此方法也适用于其他库中类似图像显示问题。

我这几天在保存图时发现我有的图可以保存下来,有些就显示了类似

<Figure size 800x550 with 0 Axes>

这种的小字,然后运行是可以显示的,但是存下来的图是空白的

找了优快云很多贴都是说用plt.savefig()保存图片空白是应为把plt.show()放在了plt.savefig()前面导致的。但是我这边明显不是这种情况

错误如下

这是我用SHAP画的一幅热图,退回主界面看这个文件的内存占的很少(打开里面就是空白的)

后面发现了十分契合这种问题的解决方法

shap.plots.heatmap(shap_values[1:100])

这个是原来的代码

当我改成下面这个代码,就是在你的绘图命令后加一条show=False

shap.plots.heatmap(shap_values[1:100], show=False)

就可以解决问题了

改了代码后再存这幅图,它的内存明显比空白的时候大了很多,点开就是正常显示的图片了

(备注,该方法也适用于其它库存图出现的类似的情况,不止SHAP库)

<Figure size 800x550 with 0 Axes>是使用plt.show()语句时出现的

感谢观看!希望这条帖子可以对遇见同样问题的大家有点帮助。

<think>好的,用户遇到了Matplotlib显示“Figure size 1600x1200 with 0 Axes”的问题,需要理解其含义和解决方法。首先,我得分析这个提示的含义。通常,当Matplotlib显示类似的信息时,比如Figure size后面跟着尺寸和“0 Axes”,意味着用户创建了一个形对象(Figure),但还没有在其中添加任何坐标系(Axes)。这时候形是空的,没有绘区域,所以无法显示任何表。 接下来,我需要回想用户提供的引用内容。引用[3]和[5]提到使用Axes3D时出现类似的问题,解决方法是通过add_subplot或add_axes来添加坐标系。特别是引用[5]指出,将ax = Axes3D(figure)改为figure.add_subplot(projection='3d')可以解决问题。这说明正确添加Axes是关键步骤。 用户的问题可能出现在创建Figure之后没有正确添加Axes。常见的错误可能是直接创建了Figure但忘记调用add_subplot或add_axes,或者在添加Axes时参数不正确。例如,使用过时的Axes3D(figure)方法而不是推荐的方法。 接下来,我需要整理解决步骤。首先,确认用户是否正确添加了坐标系。如果使用subplot,需要指定行、列和索引。例如,add_subplot(111)或更现代的add_subplot(projection='3d')。其次,检查是否有拼写错误或参数错误,比如误将add_subplot写成add_subplots,或者参数顺序不对。此外,确保在添加Axes之后进行绘操作,而不是在之前。 还要考虑用户是否在Jupyter Notebook中运行,可能需要使用%matplotlib inline来正确显示形。另外,检查plt.show()的位置是否正确,确保在生成所有表之后调用。 可能用户在使用3D绘时,没有正确设置projection参数,导致Axes未被正确创建。例如,使用旧的Axes3D方法,而新版本Matplotlib推荐使用add_subplot的projection参数。此外,确认是否导入了必要的模块,如from mpl_toolkits.mplot3d import Axes3D,尽管在新版本中可能不需要显式导入。 最后,提供示例代码,展示如何正确添加Axes,并指出常见的错误写法,帮助用户对比。同时,提醒用户检查代码中的每个步骤,确保每个Figure都有对应的Axes,避免遗漏。</think>### Figure size 1600x1200 with 0 Axes 含义与解决方案 #### 问题解释 当Matplotlib输出类似`Figure size 1600x1200 with 0 Axes`的提示时,表示: 1. 成功创建了画布(Figure),尺寸为1600×1200像素 2. **未添加坐标系**(Axes),即没有实际的绘区域 3. 最终显示的是空白画布[^3][^4] #### 常见原因 1. **未调用坐标系添加方法** - 仅创建Figure但忘记添加Axes: ```python fig = plt.figure(figsize=(16,12)) # 仅创建画布 plt.show() # 缺少add_axes或add_subplot ``` 2. **3D绘API使用错误** - 旧版写法导致坐标系未正确注册: ```python # 错误写法 fig = plt.figure() ax = Axes3D(fig) # 不会自动注册坐标系到figure ``` 应改为: ```python ax = fig.add_subplot(projection='3d') # 正确写法[^5] ``` 3. **子参数错误** - 错误的subplot参数导致坐标系未创建: ```python fig.add_subplot(0,0,0) # 行列索引应从1开始 ``` #### 解决方案 1. **显式添加坐标系** ```python fig = plt.figure(figsize=(16,12)) ax = fig.add_subplot(111) # 添加1x1网格中的第1个坐标系 ax.plot([1,2,3], [4,5,6]) plt.show() ``` 2. **3D绘规范写法** ```python from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(projection='3d') # 使用标准接口 ax.scatter(x, y, z) plt.show() ``` 3. **验证坐标系数量** ```python print(fig.axes) # 应返回坐标系对象列表 # 输出示例:[<Axes3D: >] ``` #### 常见错误对比 | 错误类型 | 错误代码示例 | 正确代码示例 | |------------------------|----------------------------------|---------------------------------------| | 缺少坐标系添加 | `plt.figure()` → `plt.show()` | 添加`add_subplot()`或`add_axes()` | | 3D坐标系旧接口 | `ax = Axes3D(fig)` | `ax = fig.add_subplot(111, projection='3d')` | | 子参数越界 | `add_subplot(0,0,0)` | `add_subplot(1,1,1)` |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值