Benjamin Root <ben.root-grryuj3d...@public.gmane.org> writes: > On Thu, Oct 28, 2010 at 3:31 PM, Nikolaus Rath > <nikolaus-bth8mxji...@public.gmane.org> wrote: > >> Hello, >> >> I'm having a weird problem with a contour plot. Consider the following >> plots: >> >> import cPickle as pickle >> import matplotlib.pyplot as plt >> (Theta, Phi, Bnormal) = pickle.load(open('trouble.pickle', 'rb')) >> plt.figure(0) >> for i in [0, 300]: >> plt.plot(Theta, Bnormal[:, i], label='Bnormal at Phi=%.3g' % Phi[i]) >> >> plt.ylabel('Theta') >> plt.legend() >> plt.savefig('figure0.png') >> plt.figure(1) >> plt.contourf(Phi, Theta, Bnormal) >> plt.xlabel('Phi') >> plt.ylabel('Theta') >> plt.colorbar() >> plt.savefig('figure1.png') >> >> The 'trouble.pickle' file is available on >> http://www.rath.org/trouble.pickle. At Phi=0 the contour plot agrees >> with the crossection (both show an n=7 oscillation), but at Phi=1.68 the >> contour plot shows a uniform value while the crossection shows a phase >> shifted version of oscillation at Phi=0. >> >> It seems to me that this is a blatant contradiction. >> >> >> I have also uploaded the two figures at http://www.rath.org/figure1.png >> and http://www.rath.org/figure0.png. >> >> >> Am I missing something, or is this a bug? >> >> $ python --version >> Python 2.6.5 >> $ python -c 'import matplotlib; print matplotlib.__version__' >> 1.0.0 >> >> >> Thanks, >> >> -Nikolaus >> >> > Nikolaus, > > What might be happening is that the Theta variable isn't monotonic. It > first goes from zero to pi, then from -pi to 0. This also explains the odd > lines that appear in the line plots at the top and bottom. Try reforming > your arrays so that the domain is monotonic (note that you will have to > adjust the Phi and the Bnormal arrays as well because they were arranged > assuming a certain domain from Theta.
Indeed, this was the problem. Thank you very much! However, it seems to me that this is quite a serious bug. The contour documentation on http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.contour does not mention this requirement, and obviously the contour method itself does not even bother to check if its arguments are monotonically increasing. Instead, it just *silently* produces garbage that in some cases even looks like plausible data(!). Am I missing something here? Otherwise I'll report this on the bug tracker. I think this should be documented and contour() should check its input and raise a ValueError if it's not monotonic. Best, -Nikolaus -- »Time flies like an arrow, fruit flies like a Banana.« PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C ------------------------------------------------------------------------------ Nokia and AT&T present the 2010 Calling All Innovators-North America contest Create new apps & games for the Nokia N8 for consumers in U.S. and Canada $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store http://p.sf.net/sfu/nokia-dev2dev _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users