程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使 Matplotlib 小部件更快?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使 Matplotlib 小部件更快??

开发过程中遇到如何使 Matplotlib 小部件更快?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使 Matplotlib 小部件更快?的解决方法建议,希望对你解决如何使 Matplotlib 小部件更快?有所启发或帮助;

我在有许多绘图的图形上使用 Matplotlib 小部件滑块。当我移动滑块时,更新图形大约需要 5 秒,这就是我的问题。

在对问题进行故障排除后,罪魁祸首似乎是调用 fig.canvas.draw() 的小部件本身。当在移动滑块时不做任何操作(不修改任何子图)时,它仍然需要 5 秒来更新滑块,因为 fig.canvas.draw() 使它在每次我触摸滑块时重新绘制所有带有所有子图的图形.

在所有抱怨 Matplotlib 绘图速度的线程中,例如:why is plotTing with Matplotlib so slow?,建议不要使用 fig.canvas.draw() 因为它重绘整个图形而使用 ax.draw_artist() 而不是重新绘制已修改的子图的数据。所以 Matplotlib 小部件破坏了我使这个图具有交互性的所有努力(5s 延迟并不是真正的交互性)。之前我就知道我可能会去另一个图书馆,但现在为时已晚。

这个问题其实是在2013年(http://matplotlib.1069221.n5.nabble.com/Making-an-interactive-plot-faster-td41312.html)提出的,建议改用draw_artist。将 drawon 设置为 false 的可能性对我不起作用,因为正如本文所述,小部件无论如何至少调用一次 fig.canvas.draw() 。自从这个问题在大约 8 年前首次被提出以来,是否有任何改进(我还没有发现)使 Matplotlib 小部件只更新小部件并让用户决定图形上的哪个元素也应该更新?

我认为这是 Matplotlib 小部件的主要限制,我真的希望有一种方法可以纠正这种行为。在我的情况下,我可能可以通过将最大的图(静态)绘制为图像或减少点数来加速图,但它仍然比不每次都重新绘制小部件效率低。

--------------------更新----------------------

创建图形并仅添加小部件(5 个滑块、4 个按钮、1 个单选按钮)和 3 个空子图后,滑块已经滞后!此时没有数据,图形上只有 10 个小部件和 3 个空子图,并且每次我想移动滑块时已经有大约 0.5 秒 - 1 秒的滞后(通过眼睛)。 如果我连续上下移动滑块,我的 cpu 会从 15% 跳到 50%!我有一台带 i7 7660U 的戴尔 XPS13(2 核 4 线程,4GHz 睿频)。我不明白如何移动 1 个滑块会如此占用 cpu。 matplotlib 计算有什么讲究? 结果,我没有任何解决方法了。我用图像替换最大绘图的想法不是很有用,因为即使没有任何数据或图像,滑块也已经太慢了!

有谁知道移动 1 个滑块会如此疯狂地占用 cpu,最重要的是,每次我触摸滑块时如何避免这种延迟?

谢谢

这是我用来生成带有 10 个小部件和 3 个空子图的图形的代码示例。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.Widgets import SlIDer,button,Radiobuttons

fig = plt.figure(figsize=(16,10))
ax1 = plt.subplot2grID((6,10),(0,0),rowspan = 2,colspan = 8)
ax2 = plt.subplot2grID((6,(3,colspan = 7)
ax3 = plt.subplot2grID((6,8),colspan = 2)

ax_color = 'lightgoldenrodyellow' # color of the slIDers
ax_win = plt.axes([0.23,0.53,0.65,0.023],facecolor=ax_color)
ax_thres = plt.axes([0.23,0.5,facecolor=ax_color)
ax_min_dist = plt.axes([0.23,0.56,facecolor=ax_color)
ax_move_win = plt.axes([0.55,0.05,0.35,facecolor=ax_color)
ax_resize_win = plt.axes([0.55,0.08,facecolor=ax_color)
ax_save_res = plt.axes([0.20,0.075,0.04])
ax_save_all = plt.axes([0.30,0.04])
ax_prevIoUs = plt.axes([0.05,0.04])
ax_next = plt.axes([0.1,0.04])
ax_cb = plt.axes([0.85,0.6,0.12,0.15])
ax_cb.set_frame_on(false)
ax_cb.text(0.5,1,'Plot',horizontalalignment='center',verticalalignment='top',transform=ax_cb.transaxes,Fontsize=16)

s_win = SlIDer(ax_win,'Res window wIDth [kHz]',10,1000,valinit = 2e5/1e3)
s_thresdB = SlIDer(ax_thres,'Min res depth threshold [dB]',-10,0.0,valinit = -0.5)
s_min_dist = SlIDer(ax_min_dist,'Min inter-res distance [kHz]',3,valinit = np.log10(6))
s_move_win = SlIDer(ax_move_win,'Zoom position',valinit = 0)
s_resize_win = SlIDer(ax_resize_win,'Zoom wIDth',0.25,valinit = 0.05)
b_save_res = button(ax_save_res,'Save res',color='lightblue',hovercolor='gold')
b_save_all = button(ax_save_all,'Save all res',hovercolor='gold')
b_prevIoUs = button(ax_prevIoUs,'PrevIoUs',color='greenyellow',hovercolor='gold')
b_next = button(ax_next,'Next',hovercolor='gold')
cb_plot2 = Radiobuttons(ax_cb,('FPtemp vs fres','BBtemp vs fres','Close'),(false,false,TruE))

解决方法

好的,经过一些调查,看起来 Matplotlib 3.3.1 有问题(如此处所述:https://github.com/matplotlib/matplotlib/pull/18304)。更新到 3.3.2 版有很大帮助。仍然有一点延迟,所以它并不完美,但它更有用。

大佬总结

以上是大佬教程为你收集整理的如何使 Matplotlib 小部件更快?全部内容,希望文章能够帮你解决如何使 Matplotlib 小部件更快?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:如何使