pyplot: Extract contourset without plotting

Dear all,

contourset = pyplot.contour(..)

calculates the contourset but also grabs whatever figure is currently
active *somewhere* in the entire code
and whichever scope it was created. The contours are plotted into it.

While I could possibly live with that, I would really like to
suppress any plotting and grabbig of focus. Only the contourset
should be calculated.

I can't find anything that describes this. Everybody wants the plot,
not me.

I would like to avoid hte workaround to ask for the currently active
figure (if!! there is one at all), store the number, and later return
focus. Is there no switch parameter (in pyplot or for contour at
least) that turns plotting off?

Regards
Daniel

Hi Daniel,

I'm not sure if this gets at what you're asking for, but if
you just want the contours plotted on a figure other than the
currently active one, grab a handle to some other axes and call
contour from the axes itself (the parameters are the same).
Here's what I mean:

-----------
f,ax =plt.subplots(1,1) #grab handles to figure and axes
# or, if you're using an older version of matplotlib, do:
# f=plt.figure();ax=plt.subplot(1,1,1)

f2,ax2 =plt.subplots(1,1) # "f" no longer active figure
...
contourset = ax.contour(...) # draw to the old figure "f"
-----------

You can read more about the difference between using pyplot and
using the object-oriented api here:

http://matplotlib.sourceforge.net/faq/usage_faq.html

On the other hand, if you just want the contour to not show up,
you can pass it alpha=0.0 to make it completely transparent and
invisible (but it's still there)

contourset = pyplot.contour(.., alpha=0.0)
# later call contourset.set_alpha(1.0) to make visible again

best,
-- Paul Ivanov

Dear Paul,

no, I would like to suppress plotting entirely, avoid changing of active figure and avoid handling figures or axis completely.
I m only interested in the contourset. I wonder if my post was somehow sloppy.

Yes, there are work-arounds like creating a dummy figure, similar to your suggestion, and return focus to
the previously active figure. But plotting takes time and memory, is not needed and requires several code lines. Once might be ok but speed and memory is important.
Plotting with alpha=0 still requires figure and axis handling.

So how can I switch off all figure and axis related actions and savely call contourset = contour(x,y,...) that does nothing else than return the contours?

Regards
Daniel

Dear all,

contourset = pyplot.contour(..)

calculates the contourset but also grabs whatever figure is currently
active *somewhere* in the entire code
and whichever scope it was created. The contours are plotted into it.

While I could possibly live with that, I would really like to
suppress any plotting and grabbig of focus. Only the contourset
should be calculated.

I can't find anything that describes this. Everybody wants the plot,
not me.

I would like to avoid hte workaround to ask for the currently active
figure (if!! there is one at all), store the number, and later return
focus. Is there no switch parameter (in pyplot or for contour at
least) that turns plotting off?

Regards
Daniel

Hi Daniel,

I'm not sure if this gets at what you're asking for, but if
you just want the contours plotted on a figure other than the
currently active one, grab a handle to some other axes and call
contour from the axes itself (the parameters are the same).
Here's what I mean:

-----------
f,ax =plt.subplots(1,1) #grab handles to figure and axes
# or, if you're using an older version of matplotlib, do:
# f=plt.figure();ax=plt.subplot(1,1,1)

f2,ax2 =plt.subplots(1,1) # "f" no longer active figure
...
contourset = ax.contour(...) # draw to the old figure "f"
-----------

You can read more about the difference between using pyplot and
using the object-oriented api here:

http://matplotlib.sourceforge.net/faq/usage_faq.html

On the other hand, if you just want the contour to not show up,
you can pass it alpha=0.0 to make it completely transparent and
invisible (but it's still there)

contourset = pyplot.contour(.., alpha=0.0)
# later call contourset.set_alpha(1.0) to make visible again

best,
--
Paul Ivanov

Dear Paul,

no, I would like to suppress plotting entirely, avoid changing of
active figure and avoid handling figures or axis completely.
I m only interested in the contourset. I wonder if my post was
somehow sloppy.

Yes, there are work-arounds like creating a dummy figure, similar to
your suggestion, and return focus to
the previously active figure. But plotting takes time and memory, is
not needed and requires several code lines. Once might be ok but
speed and memory is important.
Plotting with alpha=0 still requires figure and axis handling.

So how can I switch off all figure and axis related actions and
savely call contourset = contour(x,y,...) that does nothing else than
return the contours?

Look at contour.py, specifically QuadCountourSet._process_args. You will see the call to _cntr.Cntr. That is the core class, implemented in extension code. The contour generation is in the method _get_allsegs_and_allkinds, via the call to the Cntr.trace() method. You will have to put together your own function to instantiate Cntr and call Cntr.trace for each level.

A major refactoring could be done to separate the calculation from the plotting, maybe by making the ContourSet into a compound artist and putting the drawing into a draw() method instead of having it called in the __init__() method.

Eric

ยทยทยท

On 01/27/2011 09:21 AM, Daniel Fulger wrote:

Regards
Daniel