python matplotlib blit到图的轴或侧面?

cha*_*ase 6 python user-interface matplotlib

每次我通过一个适合的程序,我试图刷新我在gui中的一些情节.此外,这些图是在可以调整大小的framw内,因此在调整大小后需要重新绘制轴和标签等.所以,想知道是否有人知道如何使用类似更新图的两侧plot.figure.canvas.copy_from_bboxblit.这似乎只复制和blit图形区域的背景(绘制线条的位置),而不是图形或图形的边(标签和刻度线的位置).我一直试图让我的图表通过反复试验和读取mpl文档进行更新,但到目前为止,我的代码已经变得非常复杂,例如self.this_plot.canvas_of_plot..etc.etc.. .plot.figure.canvas.copy_from_bbox......这可能太复杂了.我知道我的语言可能有些偏差,但我一直在尝试阅读matplotlb文档,图,画布,图形,情节,图形等之间的差异开始躲避我.所以我的首要问题是:

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

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

2 - 关于它们在GUI中覆盖的区域,绘图,图形,画布等之间有什么区别.

非常感谢你的帮助.

Joe*_*ton 18

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

首先,如果你正在链接蜱等,那么使用blitting没什么意义.如果只是某些事情发生变化,Blitting只是避免重新绘制所有内容的一种方法.如果一切都在变化,那么使用blitting是没有意义的.重新绘制情节.

基本上,你只是想要fig.canvas.draw()plt.draw()

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

至于你的第二个问题,一个良好的,详细的概述是艺术家教程中的Matplotlib用户指南.

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

你可以在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
Run Code Online (Sandbox Code Playgroud)

无论如何,希望这会让事情变得更加清晰.

如果你真的想使用blitting来更新刻度标签等,你需要抓住并恢复包括它们在内的整个区域.这个区域有点棘手,因为直到绘制时间之后才知道它(在matplotlib中渲染文本比由于乳胶支持而渲染其他东西更复杂).你可以做到这一点,如果它真的是你想要的话,我会很高兴给出一个例子,但它通常不会比仅仅绘制所有东西产生速度优势.(例外情况是,如果您只更新包含大量子图的图中的一个子图.)

  • 非常感谢matplotlib元素的精彩总结.我知道这对我和网上的许多其他人都有用,可以作为理解模块整体结构的参考. (4认同)
  • 我想看看您更新单个子图的示例。你能用那个扩展你的答案吗? (2认同)