Python Matplotlib:将blit绘制到图形的轴或侧边?

8
我正在尝试在GUI中的适配过程中刷新一些图形,同时这些图形在一个可调整大小的框架中,所以需要调整大小后重新绘制轴和标签等。因此,我想知道是否有人知道如何使用类似于plot.figure.canvas.copy_from_bbox和blit的东西更新图形的侧面。这似乎只复制和blit绘图区域的背景(线被绘制的地方),而不是图形或图形的侧面(标签和刻度线所在的位置)。我一直试图通过试验和阅读mpl文档来更新我的图形,但到目前为止,我的代码已经变得非常复杂,像self.this_plot.canvas_of_plot..等等.. .plot.figure.canvas.copy_from_bbox这样的东西... 这可能太过纠结。 我知道我的语言可能有点不准确,但我一直在阅读matplotlb文档,并且Figure、canvas、graph、plot、figure.Figure等之间的差异开始逃避我。因此,我的首要问题是:
1- 如何更新matplotlib图形周围的刻度和标签。
其次,因为我希望更好地掌握这个问题的答案,
2- 在涉及它们在GUI中覆盖的区域时,plot、figure、canvas等之间有什么区别。
非常感谢您的帮助。
1个回答

23

一开始这些可能会令人感到相当困惑!

首先,如果您正在链接刻度等,则没有使用blitting的必要。Blitting只是一种避免重新绘制所有内容的方法,如果只有一些内容更改,则没有使用blitting的必要。如果所有内容都在更改,则没有使用blitting的必要。只需重新绘制图形即可。

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

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

至于您的第二个问题,一个好的、详细的概述是Artist TutorialMatplotlib User's Guide

简而言之,有两个独立的层。一个处理将事物分组为绘图时关心的部分(例如图形、轴、坐标轴、线条等),另一个处理渲染和绘制(画布和渲染器)。

在 matplotlib 绘图中,任何你能看到的东西都是一个 Artist(比如文本、线条、坐标轴,甚至包括图形本身)。一个 artist a)知道如何绘制自己,并且 b)可以包含其他 artists。

为了绘制一个 artist,它使用渲染器(一个特定于后端的模块,你几乎永远不会直接接触)在 FigureCanvas 上绘制,也就是所谓的 "画布"(一个抽象概念,可以是基于矢量的页面或像素缓冲区)。要绘制图形中的所有内容,调用 canvas.draw()

由于 artists 可以是其他 artists 的组合,因此有一个层次结构。基本上是这样的(当然,这可能会有所变化):

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

希望这可以让事情更加清晰。如果您真的想使用 blitting 来更新刻度标签等内容,则需要获取并恢复包括它们在内的整个区域。这个区域有点棘手,因为直到绘制时间之后才确切知道(由于 matplotlib 支持 LaTeX 等功能,渲染文本比渲染其他内容更加复杂)。您可以这样做,如果这确实是您想要的,我很乐意给出一个示例,但通常不会比直接绘制所有内容获得速度优势。(唯一的例外是,如果您只更新图中的一个子图,而该图具有大量子图。)

5
非常感谢您提供这篇精彩的matplotlib元素总结。我知道这将对我以及许多其他网友作为了解该模块整体结构的参考资料非常有用。 - chase
这非常棒。我已经寻找2年了,想要一个好的总结来说明Fig/Axes/Axis类应该如何关联! - tbc
3
我希望看到你的一个示例,其中单个子图被更新。你能用那个示例扩展你的回答吗? - Lennart
1
我正在为自己开发MRE,但最终会将其发布到SO作为自我回答的问题。在PyQt5中嵌入,当新数据不推动x / y限制时,速度优势存在(200 fps而不是50)。有趣的是,在普通的matplotlib中,即使实时更改限制和标签,我也可以获得200 fps的速度。 - Guimoute
1
@Guimoute谢谢您!我通过将实时绘图移动到一个更强大的机器上来解决了我的问题,但我仍然非常感兴趣。不过,请不要为我感到压力,没必要完成它;-) - filippo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接