I want to make a plot of 2D data where the values are determined from bilinear interpolation. As an initial test, I decided to just use the example from the wikipedia page: http://en.wikipedia.org/wiki/File:Bilininterp.png
However, in general, I would need this to work for any set of data, so a solution that works just for this special, specific case is not useful. A slightly more complex example is in the data below, commented out as "Another example".
Here are the few tries that I've made so far, with comments that mention why it doesn't work:
import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
# http://en.wikipedia.org/wiki/File:Bilininterp.png
xi = np.array([0.0, 1.0])
yi = np.array([0.0, 1.0])
zi = np.array([[0.0, 1.0], [1.0, 0.5]])
# Another example
#xi = np.array([0.0, 0.25, 1.0])
#yi = np.array([0.0, 0.75, 1.0])
#zi = np.array([[0.0, 0.5, 1.0], [0.5, 0.7, 0.5], [1.0, 1.0, 1.0]])
# I want 20 "levels" to be shown
contour_breaks = 20
ticks = np.linspace(zi.min(), zi.max(), contour_breaks, endpoint=True)
# Attempt #1 (contour does not use bilinear interpolation)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
axes.contour(xi, yi, zi, ticks[1:-1], colors='k')
fill = axes.contourf(xi, yi, zi, ticks, cmap=cm.jet)
fig.colorbar(fill, ticks=ticks)
# Attempt 2 (colors are weird for imshow -- they don't seem to be jet. I can't
# make it use ticks to make constant color zones/levels. The contour
# lines are the same as before (no bilinear). Also, you cannot input
# xi and yi, so the data would have to be interpolated to a regular
# grid - see the second set of example data above for an example
# where the data isn't regularly spaced)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
axes.contour(xi, yi, zi, ticks[1:-1], colors='k')
fill = axes.imshow(zi, interpolation='bilinear', cmap=cm.jet,
extent=(0.,1.,0.,1.))
fig.colorbar(fill, ticks=ticks)
# Attempt 3 (griddata doens't do bilinear interpolation)
fig = plt.figure()
axes = fig.add_subplot(111, aspect='equal')
xi1, yi1 = np.meshgrid(xi, yi)
xi1 = xi1.flatten()
yi1 = yi1.flatten()
zi1 = zi.flatten()
xi2 = np.linspace(0., 1., 100)
yi2 = np.linspace(0., 1., 100)
zi2 = griddata((xi1, yi1), zi1, (xi2[None,:], yi2[:,None]), method='linear')
axes.contour(xi2, yi2, zi2, ticks[1:-1], colors='k')
fill = axes.contourf(xi2, yi2, zi2, ticks, cmap=cm.jet)
fig.colorbar(fill, ticks=ticks)
# Show the plots
plt.show()