【问题标题】:python matplotlib blit to axes or sides of the figure?python matplotlib blit到图形的轴或边?
【发布时间】:2013-01-28 10:45:45
【问题描述】:

每次通过拟合程序时,我都会尝试刷新我在 gui 中的一些图。此外,这些图位于可以调整大小的框架内,因此在调整大小后需要重新绘制轴和标签等。所以想知道是否有人知道如何使用plot.figure.canvas.copy_from_bboxblit 之类的东西来更新图形的侧面。这似乎只复制和 blit 绘图区域的背景(绘制线条的位置),而不是图形或图形的侧面(标签和刻度所在的位置)。我一直试图通过反复试验和阅读 mpl 文档来更新我的图表,但到目前为止,我的代码已经变得非常复杂,其中包含 self.this_plot.canvas_of_plot..etc.etc.. .plot.figure.canvas.copy_from_bbox... 之类的东西,这可能太复杂了。 我知道我的语言可能有点不对劲,但我一直在尝试通读 matplotlb 文档,而 Figure、canvas、graph、plot、figure.Figure 等之间的差异开始让我回避。所以我的首要问题是:

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

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

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

非常感谢您的帮助。

【问题讨论】:

    标签: python user-interface matplotlib


    【解决方案1】:

    这一切一开始肯定会让人很困惑!

    首先,如果您要链接刻度等,则使用 blitting 没有多大意义。如果只有某些事情发生变化,Blitting 只是一种避免重新绘制所有内容的方法。如果一切都在变化,那么使用 blitting 就没有意义了。只需重新绘制情节即可。

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

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

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

    简而言之,有两个独立的层。一种处理将事物分组到您在绘图时会担心的部分(例如图形、轴、轴、线等),另一种处理一般的渲染和绘图(画布和渲染器)。

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

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

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

    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 来更新刻度标签等,则需要抓取并恢复包括它们在内的整个区域。这个区域有点难以获得,因为直到 after 绘制时间(由于乳胶支持等原因,在 matplotlib 中渲染文本比渲染其他内容更复杂),它才完全知道。你可以做到,如果它真的是你想要的,我很乐意举个例子,但它通常不会比仅仅绘制所有东西产生速度优势。 (例外情况是,如果您只更新具有大量子图的图中的一个子图。)

    【讨论】:

    • 非常感谢您对 matplotlib 元素的精彩总结。我知道这对我和网络上的许多其他人很有用,可以作为了解模块整体结构的参考。
    • 这太棒了。两年来我一直在寻找关于 Fig/Axes/Axis 类应该如何关联的一个很好的总结!
    • 我想看看您的示例,其中更新了单个子图。你能用这个扩展你的答案吗?
    • 我正在为自己开发一个 MRE,但最终会将它作为一个自我回答的问题发布在 SO 上。当新数据不影响 x/y 限制时,嵌入在 PyQt5 中的速度优势就在那里(200 fps 而不是 50)。有趣的是,在普通的旧 matplotlib 中,当限制和标签实时更改时,我得到 200 fps 甚至
    • @Guimute 谢谢!我通过将实时绘图转移到更强大的机器来解决我的问题 :-D 但我仍然非常感兴趣。不要为我完成它而感到压力;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多