python matplotlib保存图片太慢?全网最新解决办法,速度快了一半

通过禁用matplotlib.pyplot中的fig.canvas.draw_idle()方法,显著提升了大型数据绘图保存的速度。
部署运行你感兴趣的模型镜像

matplotlib可以说是python绘图中最最最经典的库,然而,当数据源较大时,其保存速度也会变得极慢,苦其久矣,其它绘图库,要么资料极少,要么不好用,那么,只能从其本身出发,想办法优化保存速度了。在尝试了不限于jit、清除画布等等方法均失败后,终于探索出一种有效的办法!保存时间从3.2s提升到了1.6s!!!

解决办法

  • 找到你虚拟环境中 matplotlib 里pyplot.py的位置
    例:我的是在 D:\CRR\venv\Lib\site-packages\matplotlib\pyplot.py
    一般都是在你项目目录的 venv\Lib\site-packages\matplotlib\pyplot.py
  • 打开此脚本,找到 savefig 里的 fig.canvas.draw_idle(),将其注释,我的是在978行,行号不一定相同
    在这里插入图片描述

效果

这里是注释了的,保存速度为1.6s
在这里插入图片描述

这里是没注释的,速度为3.2s
在这里插入图片描述

注意事项

如果你需要不断去plt.show(),不断刷新、渲染,不推荐此方法(我没这个需求,还没测试过此法是否试用这种情况)
如果你仅需保存图片到本地(哪怕需要背景透明(亲测)),直接使用此方法即可!!!
考虑到直接修改了库的源码,为避免其它场景下的冲突,建议在修改源码时,加个参数控制是否启用那行命令

分析过程

  1. 在pycharm里,使用这种方法分析运行情况
    在这里插入图片描述
    按照运行时间排序,发现在保存这一步花了3.6s的时间,就一行就这么慢!!!

    plt.savefig(savepath, pad_inches=0.0, transparent=True)

    在这里插入图片描述

  2. 双击点开后
    在这里插入图片描述

    发现在savefig后还有一步

    fig.canvas.draw_idle() # need this if ‘transparent=True’ to reset colors

    注释里我大概理解是指:当设置背景透明且需要刷新颜色时需要这一步 又看了看这句话消耗的时间,占了保存时的一半!!!官方还贴心的备注了可以根据具体情况重写此方法
    在这里插入图片描述

    而我们仅需保存,并没有重新渲染的需求

  3. 而且官方的注释里说了,这里就是针对GUI时间循环时刷新小部件的,我单纯的后端保存,完全用不到才对,在这里插入图片描述

  4. 尝试将其注释,看是否会影响到绘图结果
    经测试,并无影响!!!包括尺寸、大小 完全一样!!!
    在这里插入图片描述

  5. 其实还是推荐,重写一下savefig,加一个参数来判断是否关闭这个draw_idle,省的影响到后续其它的使用,毕竟是直接注释了源码

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 回答1: 使用PythonMatplotlib库可以保存图片,具体步骤如下: 1. 导入Matplotlib库 ```python import matplotlib.pyplot as plt ``` 2. 绘制图形 ```python plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) plt.ylabel('some numbers') ``` 3. 保存图片 ```python plt.savefig('myplot.png') ``` 其中,`savefig()`函数的参数可以指定保存的文件名和格式,例如: ```python plt.savefig('myplot.pdf', format='pdf') ``` 这样就可以将绘制的图形保存为PDF格式的文件。 ### 回答2: PythonMatplotlib是一个广泛使用的数据可视化库,它能够快速生成各种类型的图表和图形。从绘制简单的直线图到绘制高级的3D曲面图,Matplotlib提供了强大的绘图能力。那么在Matplotlib中,如何保存生成的图形呢? Matplotlib提供了多种保存方式,包括保存为图像文件、保存为PDF文件等。具体步骤如下: 1. 首先,导入需要的库:import matplotlib.pyplot as plt 2. 在生成图形后,使用plt.savefig()方法来保存图形。保存的文件格式可以是png, pdf, jpeg等。 例如,将图形保存为png格式: import matplotlib.pyplot as plt # 生成图形 plt.plot([1,2,3], [4,5,6]) # 保存图形 plt.savefig('myplot.png') 3. 需要注意的是,要在保存图片前使用plt.show()方法来显示图形,否则保存图片将是空白的。 4. 如果需要调整图形的分辨率、大小等参数,可以在savefig()方法中传递参数。例如: plt.savefig('myplot.png', dpi=300, bbox_inches='tight') 其中,dpi指定图片分辨率,bbox_inches用于调整图片边界。 总之,Matplotlib提供了简单易用、灵活多样的保存方式,能够满足各种绘图需求。通过合理设置参数,可以得到高质量的图片,并方便地在文章、报告等场合中使用。 ### 回答3: matplotlibpython中常用的数据可视化工具,除了可以展示和绘制图表外,还支持图片保存。在python中使用matplotlib保存图片可以采用两种方式,一种是使用plt.savefig()方法保存图片,另一种是使用FigureCanvasAgg()方法保存图片。下面分别详细介绍这两种方法。 1、使用plt.savefig()方法保存图片 plt.savefig(fname, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype=None, format=None, transparent=False, bbox_inches=None, pad_inches=0.1, frameon=None, metadata=None) 其中各参数的含义如下: fname:指定文件名和路径,格式可以是png、pdf、svg、ps和eps等。 dpi:分辨率,默认为100,表示单位英寸中含有多少个像素点。 facecolor:图片背景色,默认为白色。 edgecolor:图片边框色,默认为白色。 orientation:纵向或横向方向。 format:图片保存格式。 transparent:是否透明,默认为False。 bbox_inches:设置图表显示完整图像的区域。 pad_inches:图表周围的空白空间。 frameon:是否显示边框,默认为True。 metadata:元数据信息。 下面是一个具体的例子: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10, 100) y = np.sin(x) plt.plot(x, y) plt.savefig('sin.png') 执行以上代码后,在当前路径下会生成一个sin.png文件,其中保存的就是绘制的图表。 2、使用FigureCanvasAgg()方法保存图片 该方法的实现过程与plt.savefig()类似,但保存图片不会在屏幕上显示。 下面是具体的例子: import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_agg import FigureCanvasAgg fig, ax = plt.subplots() ax.plot(np.arange(10)) canvas = fig.canvas agg = canvas.switch_backends(FigureCanvasAgg) agg.draw() fig.savefig('test.png') 执行以上代码后,在当前路径下会生成一个test.png文件。 总结: 无论是使用plt.savefig()方法保存图片还是使用FigureCanvasAgg()方法保存图片,都是简单易用的。在实际使用中,根据自己的需求选择不同的方式即可。保存图片可以辅助我们更好的展示数据并分享给他人,因此在python数据可视化中,掌握保存图片的方法是很重要的。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一届纯良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值