how to use matplotlib contour()?

G

Grant Edwards

I downloaded examples/contour_demo.py, and it doesn't run.

I've searched both the user guide and the Wiki for "contour"
and got zero hits.

http://matplotlib.sourceforge.net/matplotlib.pylab.html#-contour
appears to be a good reference if you already know how to use
contour(), but I could glean zero clues from it on how to
actually use contour(). For example, it doesn't explain what
the actual formats/types of the parameters. It explains what
the parameters do, but not what they _are_

For example one parameter is specied as "an array". No clue as
to how many dimensions or what the axis are.

In another place it says "the X,Y parameters specify the (x,y)
coordinates of a surface". _How_ do they specify the surface?
Are they just equal length lists of x and y coordinates that
specify len(X) points. Or do they specify a len(X) x len(Y)
grid of points?

Since I can't find any documentation, I thought I'd just try a
few things.

I've got X,Y,Z values in an Nx3 array named "data" that looks
like this:

X Y Z


[[ 4.94958000e+01 3.65706000e+00 1.84600000e-01]
[ 4.94958000e+01 3.66447000e+00 1.82142000e-01]
[ 4.94958000e+01 5.04936000e+00 1.90937000e-01]
...,
[ 2.19844000e+03 9.74210000e+00 8.29735000e-01]
[ 2.19844000e+03 9.93863000e+00 9.82307000e-01]
[ 2.19844000e+03 1.03143000e+01 8.28844000e-01]]

If I just pass the array to contour() by doing
"pylab.contour(data)" I get this error:

Traceback (most recent call last):
File "./surfplot.py", line 11, in ?
pylab.contour(data)
File "/usr/lib/python2.4/site-packages/matplotlib/pylab.py", line 1659, in contour
ret = gca().contour(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/matplotlib/axes.py", line 1244, in contour
return self._contourHelper.contour(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/matplotlib/contour.py", line 727, in contour
x, y, z, lev = self._contour_args(False, badmask, origin, extent, *args)
File "/usr/lib/python2.4/site-packages/matplotlib/contour.py", line 544, in _contour_args
lev = self._autolev(z, 7, filled, badmask)
File "/usr/lib/python2.4/site-packages/matplotlib/contour.py", line 471, in _autolev
lev = linspace(zmin, zmax, N+2)[1:-1]
File "/usr/lib/python2.4/site-packages/matplotlib/mlab.py", line 87, in linspace
dx = (xmax-xmin)/(N-1)
TypeError: unsupported operand type(s) for -: 'str' and 'str'

I've no clue what that means. Well, I know what the TypeError
means _literally_, but I've no idea how I'm supposed to
interpret that particular error in regards to what I passed to
contour().

Attempting to use one of the other forms found on the above web
page I pass X,Y,Z vectors to contour() by doing
"pylab.contour(data[:,0],data[:,1],data[:,2])":

Traceback (most recent call last):
File "./surfplot.py", line 13, in ?
pylab.contour(data[:,0],data[:,1],data[:,2])
File "/usr/lib/python2.4/site-packages/matplotlib/pylab.py", line 1659, in contour
ret = gca().contour(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/matplotlib/axes.py", line 1244, in contour
return self._contourHelper.contour(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/matplotlib/contour.py", line 727, in contour
x, y, z, lev = self._contour_args(False, badmask, origin, extent, *args)
File "/usr/lib/python2.4/site-packages/matplotlib/contour.py", line 539, in _contour_args
x,y,z = self._check_xyz(args[:3])
File "/usr/lib/python2.4/site-packages/matplotlib/contour.py", line 515, in _check_xyz
raise TypeError("Input z must be a 2D array.")
TypeError: Input z must be a 2D array.

Which is almost as cryptic a result as my first attempt.

Why would my Z values be a 2D array?
 
R

Robert Kern

Grant said:
I downloaded examples/contour_demo.py, and it doesn't run.

I've searched both the user guide and the Wiki for "contour"
and got zero hits.

http://matplotlib.sourceforge.net/matplotlib.pylab.html#-contour
appears to be a good reference if you already know how to use
contour(), but I could glean zero clues from it on how to
actually use contour(). For example, it doesn't explain what
the actual formats/types of the parameters. It explains what
the parameters do, but not what they _are_

Yes, unfortunately, much of the documentation was written by people who were
very familiar with the Matlab interfaces that these functions are emulating.
For example one parameter is specied as "an array". No clue as
to how many dimensions or what the axis are.

In another place it says "the X,Y parameters specify the (x,y)
coordinates of a surface". _How_ do they specify the surface?
Are they just equal length lists of x and y coordinates that
specify len(X) points. Or do they specify a len(X) x len(Y)
grid of points?
Why would my Z values be a 2D array?

contour() only does contouring on gridded data. If you want to handle scattered
datapoints, you will have to do some interpolation.

http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

So X, Y, and Z are all 2-D arrays laid out corresponding to the grid that you
have sampled. I thought the contour_demo.py example was reasonably clear on
this, but if you didn't get it to run, then I can see why you wouldn't have read it.

Talking about this on matplotlib-users will probably get these problems fixed
faster:

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
 
G

Grant Edwards

Yes, unfortunately, much of the documentation was written by people who were
very familiar with the Matlab interfaces that these functions are emulating.

Since I've never used matlab, I'm a bit clueless.
contour() only does contouring on gridded data.

That's what I was beginning to suspect. What confused me was
that if it required gridded data, I expected the input parameters to
specify a grid (e.g. for a 5x7 grid, the X parameter would be a
vector of 5 values, and the Y parameter would be a vector of 7
values) rather than just lie on a grid.
If you want to handle scattered datapoints, you will have to
do some interpolation.

http://www.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data

Thanks, that looks like exactly what I need. My next step was
actually going to be to use the Delaunay triangulation module
to interpolate the data onto a much finer grid.
So X, Y, and Z are all 2-D arrays laid out corresponding to
the grid that you have sampled. I thought the contour_demo.py
example was reasonably clear on this, but if you didn't get it
to run, then I can see why you wouldn't have read it.

I did delete some code that was attempting to label the graph,
and then it ran. The examples do use gridded data, but when I
changed them to non-gridded data, it seemed to run fine.
Talking about this on matplotlib-users will probably get these
problems fixed faster:

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

After I got the demos to run, it became apparent that the
contour functions don't do what I want anyway, so it's all moot
at this point.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,539
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top