Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make contour of scatter

In python, If I have a set of data

x, y, z

I can make a scatter with

import matplotlib.pyplot as plt
plt.scatter(x,y,c=z)

How I can get a plt.contourf(x,y,z) of the scatter ?

like image 537
JuanPablo Avatar asked Sep 12 '13 12:09

JuanPablo


People also ask

How do you contour a plot?

A contour plot is a graphical technique for representing a 3-dimensional surface by plotting constant z slices, called contours, on a 2-dimensional format. That is, given a value for z, lines are drawn for connecting the (x,y) coordinates where that z value occurs.

What is a contour plot example?

Example Contour Plot For example, a biologist studies the effect of stream depth and canopy cover on fish biomass. A contour plot typically contains the following elements: X and Y-axes denoting values of two continuous independent variables. Colored bands representing ranges of the continuous dependent (Z) variable.

How do you change the contour color in python?

The default color scheme of Matplotlib contour and filled contour plots can be modified. A general way to modify the color scheme is to call Matplotlib's plt. get_cmap() function that outputs a color map object. There are many different colormaps available to apply to contour plots.


3 Answers

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

import matplotlib.tri as tri
import matplotlib.pyplot as plt

plt.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, meshgrid
from matplotlib.mlab import griddata

def 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

like image 141
elyase Avatar answered Oct 19 '22 03:10

elyase


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 plt
import numpy as np
x,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 np
from scipy.interpolate import griddata

xi = 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.

like image 15
ImportanceOfBeingErnest Avatar answered Oct 19 '22 01:10

ImportanceOfBeingErnest


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

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import numpy.ma as ma
from numpy.random import uniform, seed
# make up some randomly distributed data
seed(1234)
npts = 200
x = 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

like image 6
David Zwicker Avatar answered Oct 19 '22 02:10

David Zwicker