On 01/27/2011 09:21 AM, Daniel Fulger wrote:
>> 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?
>>> 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:
>>> 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
>>> 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.