Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python matplotlib blit到图形的轴或侧面?_Python_User Interface_Matplotlib - Fatal编程技术网

python matplotlib blit到图形的轴或侧面?

python matplotlib blit到图形的轴或侧面?,python,user-interface,matplotlib,Python,User Interface,Matplotlib,每次通过一个拟合过程,我都会尝试刷新gui中的一些绘图。此外,这些图位于可以调整大小的framw内,因此调整大小后需要重新绘制轴和标签等。因此,我想知道是否有人知道如何使用诸如plot.figure.canvas.copy\u from\u bbox和blit之类的东西来更新图形的侧面。这似乎只是复制和blit图形区域的背景(绘制线条的地方),而不是图形或地物的侧面(标签和记号所在的地方)。我一直在尝试通过反复试验和阅读mpl文档来更新我的图形,但到目前为止,我的代码已经变得异常复杂,像self

每次通过一个拟合过程,我都会尝试刷新gui中的一些绘图。此外,这些图位于可以调整大小的framw内,因此调整大小后需要重新绘制轴和标签等。因此,我想知道是否有人知道如何使用诸如
plot.figure.canvas.copy\u from\u bbox
blit
之类的东西来更新图形的侧面。这似乎只是复制和blit图形区域的背景(绘制线条的地方),而不是图形或地物的侧面(标签和记号所在的地方)。我一直在尝试通过反复试验和阅读mpl文档来更新我的图形,但到目前为止,我的代码已经变得异常复杂,像
self。这个图。画布图…等等。plot.figure.canvas.copy_from_bbox
。。。这可能太复杂了。 我知道我的语言可能有点不通,但我一直在努力阅读matplotlb文档,而Figure、canvas、graph、plot、Figure.Figure等之间的差异开始让我难以理解。因此,我的首要问题是:

1-如何更新matplotlib绘图周围的刻度和标签。

第二,由于我想更好地掌握这个问题的答案

2-绘图、图形、画布等在GUI中覆盖的区域方面有什么区别。


非常感谢您的帮助。

所有这些一开始肯定会让人困惑

首先,如果你正在链接滴答声等等,那么使用blitting没有多大意义。闪电只是一种避免在某些事情发生变化时重新绘制所有内容的方法。如果一切都在改变,那么使用blitting是没有意义的。重新画出情节

基本上,您只需要
fig.canvas.draw()
plt.draw()

无论如何,要回答您的第一个问题,在大多数情况下,您不需要手动更新它们。如果更改轴限制,它们将自行更新。你会遇到问题,因为你只是在轴的内部进行点动,而不是重新绘制绘图

至于你的第二个问题,一个好的,详细的概述是

简而言之,有两个独立的层。一种是将打印时需要考虑的部分(例如图形、轴、轴、线等)分组,另一种是处理渲染和一般绘图(画布和渲染器)

在matplotlib绘图中可以看到的任何东西都是艺术家。(例如文字、线、轴,甚至图形本身。)艺术家a)知道如何绘制自身,b)可以包含其他艺术家

对于艺术家自己绘制,它使用渲染器(一个后端特定模块,您几乎永远不会直接接触)在
FigureCanvas
a.k.a.“画布”(围绕基于向量的页面或像素缓冲区的抽象)上绘制。要绘制图形中的所有内容,请调用
canvas.draw()

因为艺术家可以是其他艺术家的团体,所以事物是有层次的。基本上是这样的(显然,这是不同的):

无论如何,希望这能让事情变得更清楚


如果你真的想使用blitting来更新记号标签等,你需要抓取并恢复包含它们的完整区域。该区域的获取有点棘手,因为在绘制时间之后才确切知道它(由于latex支持,在matplotlib中渲染文本比渲染其他内容更复杂,等等)。你可以做到,如果你真的想要的话,我很乐意举个例子,但它通常不会比只画所有东西产生速度优势。(例外情况是,如果在一个图中只更新一个子图,并且有很多子图。)

非常感谢您对matplotlib元素的精彩总结。我知道这将对我和许多其他网站上的人很有用,可以作为理解模块整体结构的参考。我想看看你的例子,其中一个子部分是更新的。你能用这个扩展你的答案吗?我正在为自己制作一个MRE,但最终会把它作为一个自我回答的问题发布。在PyQt5中,当新数据不影响x/y限制时,速度优势存在(200 fps而不是50 fps)。有趣的是,在普通的旧matplotlib中,即使限制和标签被实时更改,我也能获得200 fps的速度。@filippo它还没有上传,我现在没有工作电脑,但它应该在下周打开:)@filippo work让我比我预期的时间少了一些,但我没有忘记你:)它几乎完成了。
Figure
    Axes (0-many) (An axes is basically a plot)
        Axis (usually two) (x-axis and y-axis)
            ticks
            ticklabels
            axis label
         background patch
         title, if present
         anything you've plotted, e.g. Line2D's