matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域

最近在作图时需要将输出的图片紧密排布,还要去掉坐标轴,同时设置输出图片大小。

但是发现matplotlib使用plt.savefig()保存的图片

周围有一圈空白。那么如何去掉该空白呢?


首先,关闭坐标轴显示:

plt.axis('off')
但是,这样只是关闭显示而已,透明的坐标轴仍然会占据左下角位置,导致输出的图片偏右。

要想完全去掉坐标轴,需要改为以下代码:


plt.axis('off')
fig = plt.gcf()
fig.set_size_inches(7.0/3,7.0/3) #dpi = 300, output = 700*700 pixels
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)
plt.margins(0,0)
fig.savefig(out_png_path, format='png', transparent=True, dpi=300, pad_inches = 0)

即可完成去掉空白。

注:如果不采用 subplot_adjust + margin(0,0),而是在fig.savefig()的参数中添加bbox_inches = 'tight',也可以达到

去除空白的效果; 但是,这样会导致对图片输出大小的设置失效。

<think>嗯,用户在使用Jupyter Notebook时用plt.savefig保存图片,结果图片显示空白。这个问题常见吗?我得先想可能的原因。首先,用户可能在调用savefig之后才显示图形,导致保存的是空图像。因为Matplotlib的绘图逻辑通常是先生成图像,再进行保存或者显示。如果在保存之后又做了其他操作,比如调用了plt.show(),可能会导致问题。 然后,用户可能没有正确关闭或清除当前的图形。比如,如果在保存之后又创建了新的图形,之前的图形可能被覆盖或者清空,导致保存的是空白。这时候需要检查代码中是否有多次绘图的情况,或者在保存后没有正确关闭图形对象。 另一个可能性是文件路径或权限的问题。用户指定的保存路径可能不存在,或者没有写入权限,导致文件无法正确保存。这时候应该检查路径是否正确,以及是否有足够的权限。 还有,用户可能在使用不同的后端,导致保存图片时出现问题。不同的Matplotlib后端在处理图形输出时可能有不同的行为,尤其是在Jupyter这样的交互式环境中。可能需要调整后端设置,或者确保在保存图片之前正确渲染图形。 解决方法方面,首先应该确保在保存图片之前调用plt.savefig(),然后再显示图形。或者使用面向对象的方法,先创建图形和轴对象,再进行绘图和保存。另外,确保在保存图片后关闭图形,释放资源,避免后续操作覆盖了当前图形。还可以检查文件路径是否正确,确保有写入权限,或者尝试使用绝对路径。如果问题仍然存在,可能需要调整Matplotlib的后端设置,或者清除当前图形后再进行保存。 用户可能需要具体的代码示例来理解如何正确操作。例如,使用plt.figure()创建图形对象,绘制内容后先保存再显示,或者使用面向对象的方式明确管理图形和轴对象。此外,提醒用户在保存图片时指定合适的格式和分辨率,避免透明背景导致显示问题也是一个注意事项。 总结起来,可能的原因包括保存顺序错误、图形被覆盖、路径问题以及后端配置问题。解决方法主要是调整代码顺序,正确管理图形对象,检查路径和权限,以及调整后端设置。给出具体的代码示例和步骤可以帮助用户更好地理解和解决问题。</think>在Jupyter Notebook中使用`plt.savefig`保存图片时出现空白文件,通常是由于Matplotlib的绘图逻辑顺序或图形对象未正确管理导致的。以下是逐步排查和解决方法: --- ### **1. 根本原因** - **保存顺序问题**:如果在调用`plt.savefig()`后再调用`plt.show()`或其他绘图操作,可能导致图像缓冲区被清空。 - **图形对象未正确引用**:若未明确指定保存的图形对象,可能意外保存了空白画布。 - **透明背景问题**:某些格式(如PNG)默认透明背景,可能导致显示为空白(需检查是否因背景透明而误判)。 --- ### **2. 解决方法** #### **步骤1:确保保存顺序正确** - **正确顺序**:先绘图,再保存,最后显示(如果需显示)。 ```python import matplotlib.pyplot as plt # 绘制图形 plt.plot([1, 2, 3], [4, 5, 6]) # 先保存 plt.savefig("figure.png") # 指定文件名和格式 # 再显示(可选) plt.show() ``` #### **步骤2:显式管理图形对象** - 使用面向对象(OO)风格,明确指定保存的图形对象: ```python fig, ax = plt.subplots() ax.plot([1, 2, 3], [4, 5, 6]) fig.savefig("figure.png") # 直接保存fig对象 plt.close(fig) # 关闭图形释放内存 ``` #### **步骤3:检查文件路径和权限** - 使用绝对路径避免歧义: ```python plt.savefig("/full/path/to/figure.png") ``` - 确保路径存在且有写入权限。 #### **步骤4:清除图形缓存** - 若多次绘图,在每次保存前清除历史图形: ```python plt.clf() # 清除当前图形 plt.cla() # 清除当前坐标轴 ``` #### **步骤5:调整后端设置(可选)** - 在Jupyter中强制使用非交互式后端: ```python %matplotlib inline import matplotlib matplotlib.use("Agg") # 使用非交互式后端 ``` --- ### **3. 完整示例代码** ```python import matplotlib.pyplot as plt # 创建图形对象 fig, ax = plt.subplots(figsize=(6, 4)) # 绘图 ax.plot([1, 2, 3], [4, 5, 6], label="示例曲线") ax.set_title("测试图像") ax.legend() # 保存并关闭 fig.savefig("figure.png", dpi=300, bbox_inches="tight") # bbox_inches避免截断 plt.close(fig) # 显式关闭 print("图片已保存!") ``` --- ### **4. 注意事项** - **文件格式**:指定正确的后缀名(如`.png`, `.jpg`, `.svg`)。 - **分辨率**:通过`dpi`参数调整清晰度(例如`dpi=300`)。 - **透明背景**:若需不透明背景,添加参数`facecolor="white"`: ```python fig.savefig("figure.png", facecolor="white") ``` --- 通过以上步骤,应该能解决保存图片空白的问题。如果仍有异常,可检查Matplotlib版本或重启Jupyter内核后重试。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值