刚开始时,所有这一切肯定会令人困惑!
首先,如果要链接刻度线等,那么使用blitting并没有多大意义。如果只有某些内容发生更改,则发条只是避免重绘所有内容的一种方法。如果一切都在变化,则使用blitting毫无意义。只需重新绘制剧情。
基本上,您只想要fig.canvas.draw()
或plt.draw()
无论如何,要回答第一个问题,在大多数情况下,您无需手动更新它们。如果您更改轴限制,它们将自动更新。您遇到了问题,因为您只是在绘制轴的内部,而不是重新绘制绘图。
关于第二个问题,《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
无论如何,希望这使事情变得更加清晰。
如果您确实确实想使用blit来更新刻度线标签等,则需要获取并还原包括它们的整个区域。获取该区域有些棘手,因为直到绘制时间 后才 完全知道它(由于对乳胶的支持,在matplotlib中渲染文本比渲染其他对象要复杂得多)。您可以做到,如果确实需要它,我会很高兴地举一个例子,但是与仅绘制所有内容相比,它通常不会产生速度优势。(例外是,如果您仅在具有很多子图的图形中更新一个子图。)