我刚看到这个,所以希望它对你有用。我不确定为什么你的版本不起作用,虽然我通常发现pylab的工作水平太高而且自动做太多事情。
我将以下内容基于Matplotlib2DContourViewer,它似乎做你想要的:
class PhaseViewer(Matplotlib2DGridViewer):
def __init__(self, phasesigma, phasegamma, title = None, limits ={}, **kwlimits):
self.phasesigma = phasesigma
self.contour1 = None
self.phasegamma = phasegamma
self.contour2 = None
self.number = 10
self.levels = None
Matplotlib2DGridViewer.__init__(self, vars=(1-phasegamma-phasesigma),title=title,cmap=pylab.cm.hot,limits ={}, **kwlimits)
def _plot(self):
Matplotlib2DGridViewer._plot(self)
if hasattr(self, "_contourSet"):
for countourSet in self._contourSet:
for collection in ccontourSet.collections:
try:
ix = self.axes.collections.index(collection)
except ValueError, e:
ix = None
if ix is not None:
del self.axes.collections[ix]
self._contourSet = []
for var in (self.phasesigma, self.phasegamma):
mesh = var.mesh
x, y = mesh.cellCenters
z = var.value
xmin, ymin = mesh.extents['min']
xmax, ymax = mesh.extents['max']
from matplotlib.mlab import griddata
xi = fp.numerix.linspace(xmin, xmax, 1000)
yi = fp.numerix.linspace(ymin, ymax, 1000)
# grid the data.
zi = griddata(x, y, z, xi, yi, interp='linear')
zmin, zmax = self._autoscale(vars=[var],
datamin=self._getLimit(('datamin', 'zmin')),
datamax=self._getLimit(('datamax', 'zmax')))
self.norm.vmin = zmin
self.norm.vmax = zmax
if self.levels is not None:
levels = self.levels
else:
levels = fp.numerix.arange(self.number + 1) * (zmax - zmin) / self.number + zmin
self._contourSet.append(self.axes.contour(xi, yi, zi, levels=levels, cmap=self.cmap))
self.axes.set_xlim(xmin=self._getLimit('xmin'),
xmax=self._getLimit('xmax'))
self.axes.set_ylim(ymin=self._getLimit('ymin'),
ymax=self._getLimit('ymax'))
if self.colorbar is not None:
self.colorbar.plot()