From: Daniel M. <dan...@go...> - 2011-01-08 22:07:36
Attachments:
mpl3D.py
|
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 |
From: Benjamin R. <ben...@ou...> - 2011-01-08 22:49:07
|
On Sat, Jan 8, 2011 at 4:07 PM, Daniel Mader < dan...@go...> 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 |
From: Daniel M. <dan...@go...> - 2011-01-09 12:42:06
|
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...@ou...>: > On Sat, Jan 8, 2011 at 4:07 PM, Daniel Mader > <dan...@go...> 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 > |
From: Daniel M. <dan...@go...> - 2011-01-11 14:17:29
|
> 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 |
From: Benjamin R. <ben...@ou...> - 2011-01-11 20:28:45
|
On Tue, Jan 11, 2011 at 8:17 AM, Daniel Mader < dan...@go...> 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 > 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 |
From: Daniel M. <dan...@go...> - 2011-01-12 21:07:28
|
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...@ou...>: >> 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 |
From: Daniel M. <dan...@go...> - 2011-01-12 21:30:48
Attachments:
example_mplCollection_3D.png
|
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...@ou...>: > On Wed, Jan 12, 2011 at 3:07 PM, Daniel Mader > <dan...@go...> 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 > |
From: Benjamin R. <ben...@ou...> - 2011-01-12 21:37:28
|
On Wed, Jan 12, 2011 at 3:30 PM, Daniel Mader < dan...@go...> 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 > > 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 |
From: Daniel M. <dan...@go...> - 2011-01-13 19:40:10
Attachments:
mpl3D_col.py
|
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 :( Best regards, Daniel |
From: welsberr <wel...@ba...> - 2011-05-21 15:38:11
|
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-%28bug-%29-with-mpl_toolkits.mplot3d.Axes3D-tp30624283p31671270.html Sent from the matplotlib - users mailing list archive at Nabble.com. |
From: Benjamin R. <ben...@ou...> - 2011-05-21 21:25:48
|
On Sat, May 21, 2011 at 10:38 AM, welsberr <wel...@ba...> wrote: > > > 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 |