python matplotlib blit to axes or sides of the figure?

All this can certainly be rather confusing at first!

To begin with, if you’re chaining the ticks, etc, there isn’t much point in using blitting. Blitting is just a way to avoid re-drawing everything if only some things are changing. If everything is changing, there’s no point in using blitting. Just re-draw the plot.

Basically, you just want fig.canvas.draw() or plt.draw()

At any rate, to answer your first question, in most cases you won’t need to update them manually. If you change the axis limits, they’ll update themselves. You’re running into problems because you’re blitting just the inside of the axes instead of redrawing the plot.

As for your second question, a good, detailed overview is the Artist Tutorial of the Matplotlib User’s Guide.

In a nutshell, there are two separate layers. One deals with grouping things into the parts that you’ll worry about when plotting (e.g. the figure, axes, axis, lines, etc) and another that deals with rendering and drawing in general (the canvas and renderer).

Anything you can see in a matplotlib plot is an Artist. (E.g. text, a line, the axes, and even the figure itself.) An artist a) knows how to draw itself, and b) can contain other artists.

For an artist to draw itself, it uses the renderer (a backend-specific module that you’ll almost never touch directly) to draw on a FigureCanvas a.k.a. “canvas” (an abstraction around either a vector-based page or a pixel buffer). To draw everything in a figure, you call canvas.draw().

Because artists can be groups of other artists, there’s a hierarchy to things. Basically, something like this (obviously, this varies):

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

Hopefully that makes things a touch clearer, anyway.

If you really do want to use blitting to update the tick labels, etc, you’ll need to grab and restore the full region including them. This region is a bit tricky to get, because it isn’t exactly known until after draw-time (rendering text in matplotlib is more complicated than rendering other things due to latex support, etc). You can do it, and I’ll be glad to give an example if it’s really what you want, but it’s typically not going to yield a speed advantage over just drawing everything. (The exception is if you’re only updating one subplot in a figure with lots of subplots.)

Leave a Comment