From 2b1afa9f4f270bad21e2c4b9b5e442fc2f2d078b Mon Sep 17 00:00:00 2001 From: ImportanceOfBeingErnest Date: Sun, 6 May 2018 14:38:19 +0200 Subject: [PATCH] Revive Irregularly spaced data contour example --- .../irregulardatagrid.py | 105 ++++++++++++++++++ lib/matplotlib/mlab.py | 2 +- 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 examples/images_contours_and_fields/irregulardatagrid.py diff --git a/examples/images_contours_and_fields/irregulardatagrid.py b/examples/images_contours_and_fields/irregulardatagrid.py new file mode 100644 index 000000000000..688db23e86df --- /dev/null +++ b/examples/images_contours_and_fields/irregulardatagrid.py @@ -0,0 +1,105 @@ +""" +======================================= +Contour plot of irregularly spaced data +======================================= + +Comparison of a contour plot of irregularly spaced data interpolated +on a regular grid versus a tricontour plot for an unstructured triangular grid. + +Since :meth:`~.axes.Axes.contour` and :meth:`~.axes.Axes.contourf` expect the +data to live on a regular grid, plotting a contour plot of irregularly spaced +data requires different methods. The two options are: + +* Interpolate the data to a regular grid first. This can be done with on-borad + means, e.g. via `~.tri.LinearTriInterpolator` or using external functionality + e.g. via `scipy.interpolate.griddata`. Then plot the + interpolated data with the usual :meth:`~.axes.Axes.contour`. +* Directly use :meth:`~.axes.Axes.tricontour` or + :meth:`~.axes.Axes.tricontourf` which will perform a triangulation + internally. + +This example shows both methods in action. +""" + +import matplotlib.pyplot as plt +import matplotlib.tri as tri +import numpy as np + +np.random.seed(19680801) +npts = 200 +ngridx = 100 +ngridy = 200 +x = np.random.uniform(-2, 2, npts) +y = np.random.uniform(-2, 2, npts) +z = x * np.exp(-x**2 - y**2) + +fig, (ax1, ax2) = plt.subplots(nrows=2) + +# ----------------------- +# Interpolation on a grid +# ----------------------- +# A contour plot of irregularly spaced data coordinates +# via interpolation on a grid. + +# Create grid values first. +xi = np.linspace(-2.1, 2.1, ngridx) +yi = np.linspace(-2.1, 2.1, ngridy) + +# Perform linear interpolation of the data (x,y) +# on a grid defined by (xi,yi) +triang = tri.Triangulation(x, y) +interpolator = tri.LinearTriInterpolator(triang, z) +Xi, Yi = np.meshgrid(xi, yi) +zi = interpolator(Xi, Yi) + +# Note that scipy.interpolate provides means to interpolate data on a grid +# as well. The following would be an alternative to the four lines above: +#from scipy.interpolate import griddata +#zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear') + + +ax1.contour(xi, yi, zi, 14, linewidths=0.5, colors='k') +cntr1 = ax1.contourf(xi, yi, zi, 14, cmap="RdBu_r") + +fig.colorbar(cntr1, ax=ax1) +ax1.plot(x, y, 'ko', ms=3) +ax1.axis((-2, 2, -2, 2)) +ax1.set_title('grid and contour (%d points, %d grid points)' % + (npts, ngridx * ngridy)) + + +# ---------- +# Tricontour +# ---------- +# Directly supply the unordered, irregularly spaced coordinates +# to tricontour. + +ax2.tricontour(x, y, z, 14, linewidths=0.5, colors='k') +cntr2 = ax2.tricontourf(x, y, z, 14, cmap="RdBu_r") + +fig.colorbar(cntr2, ax=ax2) +ax2.plot(x, y, 'ko', ms=3) +ax2.axis((-2, 2, -2, 2)) +ax2.set_title('tricontour (%d points)' % npts) + +plt.subplots_adjust(hspace=0.5) +plt.show() + +############################################################################# +# +# ------------ +# +# References +# """""""""" +# +# The use of the following functions and methods is shown in this example: + +import matplotlib +matplotlib.axes.Axes.contour +matplotlib.pyplot.contour +matplotlib.axes.Axes.contourf +matplotlib.pyplot.contourf +matplotlib.axes.Axes.tricontour +matplotlib.pyplot.tricontour +matplotlib.axes.Axes.tricontourf +matplotlib.pyplot.tricontourf diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 36d05aa204a7..ba01b28eb827 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -3312,7 +3312,7 @@ def newfunc(val, mask, mval): fh.close() -@cbook.deprecated('2.2') +@cbook.deprecated('2.2', alternative='scipy.interpolate.griddata') def griddata(x, y, z, xi, yi, interp='nn'): """ Interpolates from a nonuniformly spaced grid to some other grid.