Problem (bug?) with mpl_toolkits.mplot3d.Axes3D

Hello,

I have a problem with the 3D plotting of PolyCollections with
python-matplotlib-1.0.0 (on openSUSE 11.3 x86_64):

instead of being correctly stacked as in the example
http://matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html,
the plots are weirdly overlapping. The example works OK for me but I
need a PolyCollection in order to plot the results of a couple of FEM
simulations...

Code is attached which demonstrates the problem. Any help is deeply appreciated!

Thanks a million times in advance,
best regards from Salzburg, Austria,

Daniel

mpl3D.py (1.65 KB)

Daniel,

The stacking problem is fairly well known (although not very well documented). However, this is not your bug.

I haven’t exactly figure out what is wrong, but it appears that a fifth polygon is being drawn or something that is connecting back to the (0, 0) point. If you redefine your polygons a bit, you will see what I mean:

vertsQuad = [ [ (0,0), (0,1), (1,1), (1,0) ],
[ (4,1), (2,3), (2,2), (3,1)],
[ (0,1), (2,3), (2,2), (1,1)],
[ (3,0), (3,1), (4,1), (4,0)]]

As an additional note, your for-loop later in the code is a bit wrong:

zpos = [0, 1, 2, 3, 4]
for i in zpos :

zs = [zpos[i]]*len(vertsQuad)

In this case, you are using the values of zpos as both the z-location values and as an index back to itself. Try something like this:

zpos = [0, 1, 2, 3, 4]
for zval in zpos :

zs = [zval]*len(vertsQuad)

That way, the values in zpos can be any numerical value, in any order, and it makes for easier reading.

I will look a little bit further for the cause of your problem, but you can at least partly mitigate it by closing your polygon paths (this shouldn’t be necessary, but go figure…):

vertsQuad = [ [ (0,0), (0,1), (1,1), (1,0), (0,0) ],

      [ (4,1), (2,3), (2,2), (3,1), (4,1)],

      [ (0,1), (2,3), (2,2), (1,1), (0,1)],

      [ (3,0), (3,1), (4,1), (4,0), (3,0)]]

I hope this helps!
Ben Root

···

On Sat, Jan 8, 2011 at 4:07 PM, Daniel Mader <danielstefanmader@…982…> wrote:

Hello,

I have a problem with the 3D plotting of PolyCollections with

python-matplotlib-1.0.0 (on openSUSE 11.3 x86_64):

instead of being correctly stacked as in the example

http://matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html,

the plots are weirdly overlapping. The example works OK for me but I

need a PolyCollection in order to plot the results of a couple of FEM

simulations…

Code is attached which demonstrates the problem. Any help is deeply appreciated!

Thanks a million times in advance,

best regards from Salzburg, Austria,

Daniel

Dear Benjamin,

thank you very much for your explanations, it really helped me to get
a better understanding of what's going on!

I've now tried to reverse the zpos list, i.e. instead of using
[0,1,2,3,4] as the z-value for the collections I tried to plot them as
[4,3,2,1,0] but this didn't help either...

I recall that the wrong stacking has been an issue for longer, this is
why I used a transparency setting in order to "hide" this bug.

Yet, the other bug with the wrongfully closed polygons is new: I
didn't have this a couple months back, when I created this plot for
the first time, see attachments.

Again, any help is deeply appreciated!

Best regards, Daniel

2011/1/8 Benjamin Root <ben.root@...1304...>:

···

On Sat, Jan 8, 2011 at 4:07 PM, Daniel Mader > <danielstefanmader@...982...> wrote:

Hello,

I have a problem with the 3D plotting of PolyCollections with
python-matplotlib-1.0.0 (on openSUSE 11.3 x86_64):

instead of being correctly stacked as in the example
http://matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html,
the plots are weirdly overlapping. The example works OK for me but I
need a PolyCollection in order to plot the results of a couple of FEM
simulations...

Code is attached which demonstrates the problem. Any help is deeply
appreciated!

Thanks a million times in advance,
best regards from Salzburg, Austria,

Daniel

Daniel,

The stacking problem is fairly well known (although not very well
documented). However, this is not your bug.

I haven't exactly figure out what is wrong, but it appears that a fifth
polygon is being drawn or something that is connecting back to the (0, 0)
point. If you redefine your polygons a bit, you will see what I mean:

vertsQuad = [ [ (0,0), (0,1), (1,1), (1,0) ],
[ (4,1), (2,3), (2,2), (3,1)],
[ (0,1), (2,3), (2,2), (1,1)],
[ (3,0), (3,1), (4,1), (4,0)]]

As an additional note, your for-loop later in the code is a bit wrong:

zpos = [0, 1, 2, 3, 4]
for i in zpos :
...
zs = [zpos[i]]*len(vertsQuad)

In this case, you are using the values of zpos as both the z-location values
*and* as an index back to itself. Try something like this:

zpos = [0, 1, 2, 3, 4]
for zval in zpos :
...
zs = [zval]*len(vertsQuad)

That way, the values in zpos can be any numerical value, in any order, and
it makes for easier reading.

I will look a little bit further for the cause of your problem, but you can
at least partly mitigate it by closing your polygon paths (this shouldn't be
necessary, but go figure...):

vertsQuad = [ [ (0,0), (0,1), (1,1), (1,0), (0,0) ],
[ (4,1), (2,3), (2,2), (3,1), (4,1)],
[ (0,1), (2,3), (2,2), (1,1), (0,1)],
[ (3,0), (3,1), (4,1), (4,0), (3,0)]]

I hope this helps!
Ben Root

Daniel,

Interesting… this will need to be investigated a little bit further. In the meantime, making a single polycollection with all the pieces seem to do the trick for now. I have attached a modified version of your script to demonstrate.

Ben Root

mpl3D.py (1.47 KB)

···

On Sun, Jan 9, 2011 at 6:41 AM, Daniel Mader <danielstefanmader@…982…> wrote:

Dear Benjamin,

thank you very much for your explanations, it really helped me to get

a better understanding of what’s going on!

I’ve now tried to reverse the zpos list, i.e. instead of using

[0,1,2,3,4] as the z-value for the collections I tried to plot them as

[4,3,2,1,0] but this didn’t help either…

I recall that the wrong stacking has been an issue for longer, this is

why I used a transparency setting in order to “hide” this bug.

Yet, the other bug with the wrongfully closed polygons is new: I

didn’t have this a couple months back, when I created this plot for

the first time, see attachments.

Again, any help is deeply appreciated!

Best regards, Daniel

Interesting... this will need to be investigated a little bit further. In
the meantime, making a single polycollection with all the pieces seem to do
the trick for now. I have attached a modified version of your script to
demonstrate.

Dear Ben,

this is great news, it works perfectly well! Thanks a million times
for this great support!

All the best,
Daniel

Oh, btw, could you please file a bug report describing the problem and that original script? I suspect it is a slightly different problem than the usual 3d stacking problem. I don’t want to forget to look into it.

http://sourceforge.net/tracker/?group_id=80706

Thanks,
Ben Root

···

On Tue, Jan 11, 2011 at 8:17 AM, Daniel Mader <danielstefanmader@…982…> wrote:

Interesting… this will need to be investigated a little bit further. In

the meantime, making a single polycollection with all the pieces seem to do

the trick for now. I have attached a modified version of your script to

demonstrate.

Dear Ben,

this is great news, it works perfectly well! Thanks a million times

for this great support!

All the best,

Daniel

Um, after seriously playing with the file I realized that the
suggested workaround of generating a closed single polygon won't work
for me: I need the individual quads or triangles in the plot as they
correspond to FEM simulation elements and have stress values assigned
to them...

As far as I understand you, there is currently no other way of
generating this kind of plot, right?

In the meantime I will file a bug report with the example file,
hopefully it finds a solution!

2011/1/11 Benjamin Root <ben.root@...1304...>:

···

Dear Ben,

this is great news, it works perfectly well! Thanks a million times
for this great support!

All the best,
Daniel

Oh, btw, could you please file a bug report describing the problem and that
original script? I suspect it is a slightly different problem than the
usual 3d stacking problem. I don't want to forget to look into it.

http://sourceforge.net/tracker/?group_id=80706

Um, after seriously playing with the file I realized that the

suggested workaround of generating a closed single polygon won’t work

for me: I need the individual quads or triangles in the plot as they

correspond to FEM simulation elements and have stress values assigned

to them…
As far as I understand you, there is currently no other way of

generating this kind of plot, right?

No, it is perfectly possible. I attached an example.

In the meantime I will file a bug report with the example file,

hopefully it finds a solution!

Thanks for your help!

Ben Root

mpl3D.py (1.48 KB)

···

On Wed, Jan 12, 2011 at 3:07 PM, Daniel Mader <danielstefanmader@…982…> wrote:

Dear Ben,

in your example, the stacking works but the polygons are wrong, or am
I mistaken?

Attached is the plot which is generated by your code.

And, you don't have to thank me---it's me who is grateful for the support here!

Best regards,
Daniel

2011/1/12 Benjamin Root <ben.root@...1304...>:

example_mplCollection_3D.png

···

On Wed, Jan 12, 2011 at 3:07 PM, Daniel Mader > <danielstefanmader@...982...> wrote:

Um, after seriously playing with the file I realized that the
suggested workaround of generating a closed single polygon won't work
for me: I need the individual quads or triangles in the plot as they
correspond to FEM simulation elements and have stress values assigned
to them...

As far as I understand you, there is currently no other way of
generating this kind of plot, right?

No, it is perfectly possible. I attached an example.

In the meantime I will file a bug report with the example file,
hopefully it finds a solution!

Thanks for your help!

Ben Root

Oops, I forgot that I am testing out a possible patch for the spurious polygon that goes over to (0, 0).
I believe that if you just simply add the first coordinate of each polygon to the end of each one (so there are five pairs) and adding the keyword argument “closed=False” to the PolyCollection constructor should resolve that issue for now.

Thanks for using Matplotlib and helping to make it better.
Ben Root

···

On Wed, Jan 12, 2011 at 3:30 PM, Daniel Mader <danielstefanmader@…982…> wrote:

Dear Ben,

in your example, the stacking works but the polygons are wrong, or am

I mistaken?

Attached is the plot which is generated by your code.

And, you don’t have to thank me—it’s me who is grateful for the support here!

Best regards,

Daniel

Dear Ben,

again, thanks for all your support! Still, I am unable to get the plot
done. In your example, each set of elements gets a color where as I
need each element to have its own color.

I'll attach a file to demonstrate. Maybe you know how to get this
done, and sorry that I am a bit slow on this :frowning:

Best regards,
Daniel

mpl3D_col.py (2.3 KB)

Daniel Mader-2 wrote:

Hello,

I have a problem with the 3D plotting of PolyCollections with
python-matplotlib-1.0.0 (on openSUSE 11.3 x86_64):

instead of being correctly stacked as in the example
http://matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html,
the plots are weirdly overlapping. The example works OK for me [...]

The example does not work OK for me. I used it as a basis to plot some of my
data, and at first I thought all was well. Two examples of my data plots and
a plot showing the problem directly from the demo code are up at

http://austringer.net/wp/index.php/2011/05/20/plotting-a-dolphin-biosonar-click-train/

I tried using the manually-closed polygon workaround in my script without
noticeable improvement.

I then went back to the demo code, and I can reproduce the error just based
on it.

The last two plots show the problem. For my data plot, the first polygon
(red) is plotted over the second polygon (blue). The problem is worse at
various other angles, where up to a third of the polygons are plotted out of
order. The plot from the demo code shows the blue polygon overlaid on the
yellow polygon, when it should be the other way around.

For the plot with more polygons, more ranges of viewing angle show the
problem. I had to do a bit of searching to find the, admittedly odd, viewing
angle that showed the problem in the demo code. I also changed both "alpha"
specifications in the demo code to "1.0" so that transparency wasn't an
issue in viewing, but the problem can be replicated in the unmodified demo
script.

Software versions:
Python 2.6.2 (Windows)
Matplotlib 0.99.3

Wesley R. Elsberry

···

--
View this message in context: http://old.nabble.com/Problem-(bug-)-with-mpl_toolkits.mplot3d.Axes3D-tp30624283p31671270.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

Daniel Mader-2 wrote:

Hello,

I have a problem with the 3D plotting of PolyCollections with

python-matplotlib-1.0.0 (on openSUSE 11.3 x86_64):

instead of being correctly stacked as in the example

http://matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html,

the plots are weirdly overlapping. The example works OK for me […]

The example does not work OK for me. I used it as a basis to plot some of my

data, and at first I thought all was well. Two examples of my data plots and

a plot showing the problem directly from the demo code are up at

http://austringer.net/wp/index.php/2011/05/20/plotting-a-dolphin-biosonar-click-train/

I tried using the manually-closed polygon workaround in my script without

noticeable improvement.

The example had two separate issues. One was the layering issue, the second is some sort of odd polygon-closing issue. Your problem for your example (actually, there are two, but I will get to the second one later) is only the layering issue. This can not be addressed by the manually closing the polygons, as that was only trying to deal with the odd bug (which I still have not solved).

I then went back to the demo code, and I can reproduce the error just based

on it.

The last two plots show the problem. For my data plot, the first polygon

(red) is plotted over the second polygon (blue). The problem is worse at

various other angles, where up to a third of the polygons are plotted out of

order. The plot from the demo code shows the blue polygon overlaid on the

yellow polygon, when it should be the other way around.

This is a fundamental issue with the design of how mplot3d works with matplotlib. Because matplotlib is strictly a 2-D plotting library with layering. Therefore, mplot3d reduces the 3D data into an array of 2D coordinates, and a single ‘Z’ value that is passed to the layering feature. That single Z value represents the depth of all of the components of the 3D polygons. Because of this dimension reduction is intrinsic to how matplotlib works, this can never be completely resolved until matplotlib itself supports 3D data (which will likely have to wait until some new features come into numpy).

Therefore, mplot3d is only suggested to be used for “simple” 3D plots, and more advanced 3D plots can be achieved with more advanced tools such as mayavi. That being said…

For the plot with more polygons, more ranges of viewing angle show the

problem. I had to do a bit of searching to find the, admittedly odd, viewing

angle that showed the problem in the demo code. I also changed both “alpha”

specifications in the demo code to “1.0” so that transparency wasn’t an

issue in viewing, but the problem can be replicated in the unmodified demo

script.

There are ways to “mitigate” the issue. For example, in the demo code “polys3d_demo.py”, we see that multiple polygons are added to a single collection. Instead, you can create multiple collections with a single polygon in them. This way, each polygon will have a better Z-value to better represent more realistic sorting. In addition, there is a set_zsort() function for Poly3DCollection that accepts a value of “average”, “min” and “max”. By default, a Poly3DCollection uses the average depth value of the vertices as the representative depth, but in some cases, the minimum or the maximum might be better. Note that your PolyCollection object gets turned into a Poly3DCollection after calling add_collection3d(), so you can call set_zsort() after adding the collection to the 3d axes.

Software versions:

Python 2.6.2 (Windows)

Matplotlib 0.99.3

As for the second issue I noticed. In your figures, the axes labels were completely “askew” when you labeled your axes with longer names. This was a bug that only recently was fixed. I believe I got it in for v1.0.1, but I could be wrong. The fix is most definitely in the master branch of matplotlib on the github repository. I am also currently working on making the axes3d objects act a lot more like traditional axes objects, but this will take some time.

I do like your plots, and I hope this information can help you produce a better looking figure. (maybe you could even be able to sneak it in for your publication during the revision process?) If you can get the figure looking well enough, I might even be able to combine it with the new animation module and produce an animated plot of a dolphin chirp?

I hope this information helps, and thank you for using matplotlib!
Ben Root

···

On Sat, May 21, 2011 at 10:38 AM, welsberr <welsberr@…2562…5…> wrote: