|
From: John H. <jdh...@ac...> - 2005-02-09 20:00:04
|
>>>>> "Fernando" == Fernando Perez <Fer...@co...> writes:
Fernando> Hi all, I am having a bit of a problem with the order
Fernando> things get drawn. I looked at the zorder example and
Fernando> the docs, but I can't seem to find a solution. Here's
Fernando> an illustration:
Fernando> http://amath.colorado.edu/faculty/fperez/tmp/zorder_prob.png
Fernando> The red wiggly line is drawn first, by a loglog() call,
Fernando> and then the green one is an axhline() call. However,
Fernando> the green line ends up below the red one. It turns out
Fernando> that in cases where the range of the red stuff is above
Fernando> the green cutoff, this causes the green line to be
Fernando> totally obscured. And for my plots, it's important that
Fernando> the green line is clearly visible always.
Fernando> My naive expectation was that whatever was called last
Fernando> on the plot would end up on top, but that doesn't seem
Fernando> to be the case. I did a few experiments:
Fernando> x=frange(0,2*pi,npts=100) figure()
Fernando> plot(x,sin(x),x,cos(x),linewidth=10)
Fernando> plot(x,sin(2*x),linewidth=10) axhline(0,linewidth=10)
Hmm, seems to work for me -- you didn't specify the colors in your
example which makes it hard to test, so I'll add them
from pylab import *
x=frange(0,2*pi,npts=100)
figure()
plot(x,sin(x),x,cos(x),linewidth=10, color='red')
plot(x,sin(2*x),linewidth=10, color='green')
axhline(0,linewidth=10, color='blue')
show()
with results at http://matplotlib.sf.net/jdh.png
Fernando> And I can't really figure out what determines the zorder
Fernando> of all the line objects.
Well the zorder kwarg is your friend -- did you see
examples/zorder_demo.py ? Eg
plot(x,y, zorder=100) # I'm on top!
I think I have an idea of what may be causing the plot order problem
you are experiencing
From axes.py draw method
artists = []
artists.extend(self.collections)
artists.extend(self.patches)
artists.extend(self.lines)
artists.extend(self.texts)
dsu = [ (a.zorder, a) for a in artists]
dsu.sort()
for zorder, a in dsu:
a.draw(renderer)
Now, if I recall correctly, python sort doesn't guarantee preserving
order for equal element. Since the order in the respective list
(patches, lines, etc) *is* determined by the order of the plot
commands, we might be better off with
dsu = [ (a.zorder, i, a) for i, a in enumerate(artists)]
dsu.sort()
for zorder, i, a in dsu:
a.draw(renderer)
to guarantee relative order for artists with the same zorder.
Or is sort relative order preserving for equal elements?
JDH
|