Quantcast

[Matplotlib-devel] Confusion about draw_artist

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[Matplotlib-devel] Confusion about draw_artist

Matthew Brett
Hi,

We're using 'draw_artist' in an image viewer, and I just found that
our viewer is crashing using the macosx backend.  Here's a minimal
example:

import matplotlib
matplotlib.use('macosx')
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1)
im = plt.imshow([[1, 2], [3, 4]])
fig.canvas.draw()
ax.draw_artist(im)

This generates:

Traceback (most recent call last):
  File "draw_artist.py", line 8, in <module>
    ax.draw_artist(im)
  File "/Users/mb312/dev_trees/matplotlib/lib/matplotlib/axes/_base.py",
line 2423, in draw_artist
    raise AttributeError(msg)
AttributeError: draw_artist can only be used after an initial draw
which caches the render

for the macosx backend, and works correctly for the tkagg backend.

I can't see any way to cache the renderer here - could someone give me
a pointer?

Cheers,

Matthew
_______________________________________________
Matplotlib-devel mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-devel
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Confusion about draw_artist

tcaswell
Unless you have flagged the artist as `animated` (via `set_animated` or by kwarg), it will be drawn as part of the next re-draw.  You are better off just changing the `fig.canvas.draw()` to `fig.canvas.draw_idle()` and letting the GUI decide when to re-draw things.

If you want to get any performance gain from animated artists + draw_artist you will need to use blitting (which will work with the OSX backend in 2.0).

Tom

On Wed, Nov 30, 2016 at 2:11 PM Matthew Brett <[hidden email]> wrote:
Hi,

We're using 'draw_artist' in an image viewer, and I just found that
our viewer is crashing using the macosx backend.  Here's a minimal
example:

import matplotlib
matplotlib.use('macosx')
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1)
im = plt.imshow([[1, 2], [3, 4]])
fig.canvas.draw()
ax.draw_artist(im)

This generates:

Traceback (most recent call last):
  File "draw_artist.py", line 8, in <module>
    ax.draw_artist(im)
  File "/Users/mb312/dev_trees/matplotlib/lib/matplotlib/axes/_base.py",
line 2423, in draw_artist
    raise AttributeError(msg)
AttributeError: draw_artist can only be used after an initial draw
which caches the render

for the macosx backend, and works correctly for the tkagg backend.

I can't see any way to cache the renderer here - could someone give me
a pointer?

Cheers,

Matthew
_______________________________________________
Matplotlib-devel mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-devel

_______________________________________________
Matplotlib-devel mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-devel
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Confusion about draw_artist

Matthew Brett
Hi,

Sorry to keep displaying my confusion on this one but...

On Wed, Jan 4, 2017 at 6:58 PM, Thomas Caswell <[hidden email]> wrote:
> Unless you have flagged the artist as `animated` (via `set_animated` or by
> kwarg), it will be drawn as part of the next re-draw.

Adding `set_animated` doesn't help in the example above;

fig, ax = plt.subplots(1, 1)
ax.set_animated(True)
im = plt.imshow([[1, 2], [3, 4]])
fig.canvas.draw()
ax.draw_artist(im)

> You are better off
> just changing the `fig.canvas.draw()` to `fig.canvas.draw_idle()` and
> letting the GUI decide when to re-draw things.

Changing to `fig.canvas.draw_idle()` above doesn't prevent the error
from `draw_artist`, but I guess I should not have expected it would.
So I guess my question is - how do I use `draw_artist` in this case?
Is there any way to make sure that the renderer is cached first?

> If you want to get any performance gain from animated artists + draw_artist
> you will need to use blitting (which will work with the OSX backend in 2.0).

Yup, the real code does use blitting, but thanks for the reminder,

Cheers,

Matthew
_______________________________________________
Matplotlib-devel mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-devel
Loading...