On 09/04/2013 12:47 PM, Sylvain LÉVÊQUE wrote:
> Hello
>
> I have a performance issue when using a Rectangle patch with linestyle
> 'dotted'. Here is some code showing it:
>
>
> from matplotlib import gridspec
>
> gs = gridspec.GridSpec(1, 2)
> ax1 = plt.subplot(gs[0, 0])
> ax2 = plt.subplot(gs[0, 1])
>
> data = [0, 1]
>
> r1 = Rectangle([10, 0.25], 100000, 0.5, facecolor='None',
> edgecolor='red')
> r2 = Rectangle([10, 0.25], 100000, 0.5, facecolor='None',
> edgecolor='red', linestyle='dotted')
>
> ax1.add_patch(r1)
> ax2.add_patch(r2)
>
> ax1.plot(data)
> ax2.plot(data)
>
>
> The steps to reproduce:
> - %paste the code in pylab
> - select the zoom tool
> - zoom on the left plot to the left of the figure until you see the data
> within the [0, 1] range, and zoom some more (no performance issue)
> - zoom on the right plot to the left of the figure until you see the
> data within the [0, 1] range, the more you try zooming, the longer it
> takes to render
> - try zooming on the left plot again, performance is now poor
>
> So I understand I have three performance issues:
> - behaviour is different depending on linestyle

Agg uses trapezoid rendering.  To render a regular solid rectangle the 
trapezoid renderer only needs to manage 8 points.  For a dotted line, 
it's (at least) 4 points per dot, and the number of dots goes into the 
thousands.  These each must be stored in memory and repeatedly sorted as 
the shape is rendered.

> - performance issue on second plot impacts first plot

That's not surprising.  Each frame is drawn in full.


> - data outside of the view limits are taken into account for the
> rendering (performance hit even if Rectangle starts from x=10 but xlim
> was reduced by zooming to eg [0, 1])

Yes.  Generally, it is much faster to just let the renderer perform 
culling outside the bounds than to do it upfront, so that's why it's 
done that way.  However, the case of dotted lines on a solid object is a 
degenerate case.  You could try drawing each side of the rectangle as a 
separate line -- this would bring the line clipping algorithm into 
effect.  (matplotlib has a line-clipping algorithm, but it does not have 
a solid polygon clipping algorithm).

Mike

>
> I initially observed the problem in a wx application using WxAgg, I can
> reproduce it in pylab with TkAgg, on two separate computers.
>
> I've tracked this down to an increasingly slow call in backend_agg.py
> (l.145, "self._renderer.draw_path(gc, path, transform, rgbFace)" in
> matplotlib 1.3.0). It then goes to native code, I stopped there.
>
> Python 2.7.5, matplotlib 1.3.0 (also observed on 1.2.1).
>
> (I have another issue if commenting out the two last lines and
> %paste-ing it to pylab, I then get an OverflowError, I don't know if
> this is related)
>
> Thanks for your help


------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to