2013-06-14 2 views
2

Я пытаюсь решить две независимые переменные, меняющиеся геометрически по данному домену. Я хочу отобразить их дисперсию на одном экране просмотра. Как я могу получить два разных контурных графика по одному для независимой переменной в одном окне просмотра? Я использовал следующий код для двойного контура, но не могу получить разные контуры для обеих переменных (фазагамма и фазигма в моем случае). Пожалуйста, предложите, как это можно исправить или любой другой возможный способ получить два контура в одном сюжете.Два контура в одном viewer-Python FiPy

import pylab 
class PhaseViewer(Matplotlib2DGridViewer): 
    def __init__(self, phasesigma, phasegamma, title = None, limits ={}, **kwlimits): 
     self.phasesigma = phasesigma 
     self.contour1 = None 
     self.phasegamma = phasegamma 
     self.contour2 = None 

     Matplotlib2DGridViewer.__init__(self, vars=(1-phasegamma-phasesigma),title=title,cmap=pylab.cm.hot,limits ={}, **kwlimits) 
    def _plot(self): 
     Matplotlib2DGridViewer._plot(self) 

     if self.contour1 is not None or self.contour2 is not None: 
      for Ccr in self.contour1.collections: 
        Ccr.remove() 
      for Cni in self.contour1.collections: 
        Cni.remove()  
     mesh = self.phasesigma.getMesh() 
     mesh2 = self.phasegamma.getMesh() 
     shape = mesh.getShape() 
     shape2 = mesh2.getShape() 
     x, y = mesh.getCellCenters() 
     z = self.phasesigma.getValue() 
     x, y, z = [a.reshape(shape, order="FORTRAN") for a in (x, y, z)] 
     self.contour1 = pylab.contour(x, y, z, (0.5,)) 
     l, m = mesh1.getCellCenters() 
     w = self.phasegamma.getValue() 
     l, m, w = [b.reshape(shape, order ="FORTRAN") for b in (l, m, w)] 
     self.contour2 = pylab.contour(l, m, w, (0.5,)) 
     raw_input("check2") 

viewer = PhaseViewer(phasesigma=phasesigma, phasegamma=phasegamma,\ 
      title = r"%s & %s" % (phasegamma.name, phasesigma.name), datamin=0., datamax=1.) 

кроме ImportError:. зрителя = MultiViewer (зрителей = (Viewer (вары = phasesigma, datamin = 0., Datamax = 1), Viewer (вары = phasegamma, datamin = 0., Datamax = 1)))

+0

Вы пробовали черчение меши только с помощью 'contour' на обычной пару' matplotlib' осей, а не 'Matplotlib2DGridViewer '? –

+0

Нет, я не пробовал с помощью обычных осей matplotlib. – bvspavan89

ответ

2

Я только что увидел это, так что, надеюсь, он по-прежнему полезен для вас. Я не уверен, почему ваша версия не работает, хотя я обычно считаю, что 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() 
Смежные вопросы