Make contour of scatter Make contour of scatter python python

Make contour of scatter


You can use tricontourf as suggested in case b. of this other answer:

import matplotlib.tri as triimport matplotlib.pyplot as pltplt.tricontour(x, y, z, 15, linewidths=0.5, colors='k')plt.tricontourf(x, y, z, 15)

Old reply:

Use the following function to convert to the format required by contourf:

from numpy import linspace, meshgridfrom matplotlib.mlab import griddatadef grid(x, y, z, resX=100, resY=100):    "Convert 3 column data to matplotlib grid"    xi = linspace(min(x), max(x), resX)    yi = linspace(min(y), max(y), resY)    Z = griddata(x, y, z, xi, yi)    X, Y = meshgrid(xi, yi)    return X, Y, Z

Now you can do:

X, Y, Z = grid(x, y, z)plt.contourf(X, Y, Z)

enter image description here


The solution will depend on how the data is organized.

Data on regular grid

If the x and y data already define a grid, they can be easily reshaped to a quadrilateral grid. E.g.

#x  y  z 4  1  3 6  1  8 8  1 -9 4  2 10 6  2 -1 8  2 -8 4  3  8 6  3 -9 8  3  0 4  4 -1 6  4 -8 8  4  8 

can plotted as a contour using

import matplotlib.pyplot as pltimport numpy as npx,y,z = np.loadtxt("data.txt", unpack=True)plt.contour(x.reshape(4,3), y.reshape(4,3), z.reshape(4,3))

Arbitrary data

a. Interpolation

In case the data is not living on a quadrilateral grid, one can interpolate the data on a grid. One way to do so is scipy.interpolate.griddata

import numpy as npfrom scipy.interpolate import griddataxi = np.linspace(4, 8, 10)yi = np.linspace(1, 4, 10)zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear')plt.contour(xi, yi, zi)

b. Non-gridded contour

Finally, one can plot a contour completely without the use of a quadrilateral grid. This can be done using tricontour.

plt.tricontour(x,y,z)

An example comparing the latter two methods is found on the matplotlib page.


contour expects regularly gridded data. You thus need to interpolate your data first:

import numpy as npfrom scipy.interpolate import griddataimport matplotlib.pyplot as pltimport numpy.ma as mafrom numpy.random import uniform, seed# make up some randomly distributed dataseed(1234)npts = 200x = uniform(-2,2,npts)y = uniform(-2,2,npts)z = x*np.exp(-x**2-y**2)# define grid.xi = np.linspace(-2.1,2.1,100)yi = np.linspace(-2.1,2.1,100)# grid the data.zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')# contour the gridded data, plotting dots at the randomly spaced data points.CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)plt.colorbar() # draw colorbar# plot data points.plt.scatter(x,y,marker='o',c='b',s=5)plt.xlim(-2,2)plt.ylim(-2,2)plt.title('griddata test (%d points)' % npts)plt.show()

Note that I shamelessly stole this code from the excellent matplotlib cookbook