Exemple #1
0
    def _plot(self):

        var = self.vars[0]
        mesh = var.mesh

        U, V = var.numericValue

        U = numerix.take(U, self.indices)
        V = numerix.take(V, self.indices)

        ang = numerix.arctan2(V, U)
        mag = numerix.sqrt(U**2 + V**2)

        datamin, datamax = self._autoscale(vars=(mag, ),
                                           datamin=self._getLimit('datamin'),
                                           datamax=self._getLimit('datamax'))

        mag = numerix.where(mag > datamax, datamax, mag)
        mag = numerix.ma.masked_array(mag, mag < datamin)

        if self.log:
            mag = numerix.log10(mag)
            mag = numerix.ma.masked_array(mag, numerix.isnan(mag))

        U = mag * numerix.cos(ang)
        V = mag * numerix.sin(ang)

        self._quiver.set_UVC(U, V)

        self.axes.set_xlim(xmin=self._getLimit('xmin'),
                           xmax=self._getLimit('xmax'))
        self.axes.set_ylim(ymin=self._getLimit('ymin'),
                           ymax=self._getLimit('ymax'))
    def autoscale(self):
        'Try to choose the view limits intelligently'
        self.verify_intervals()
        vmin, vmax = self.dataInterval.get_bounds()

        if vmax < vmin:
            vmin, vmax = vmax, vmin

        if vmax * vmin > 0:
            raise ValueError(
                "The interval must range from negative to positive values")

        if vmax == self.threshold:
            vmax += 1
        if vmin == -self.threshold:
            vmin -= 1

        exponent, remainder = divmod(numerix.log10(vmax - vmin), 1)

        if remainder < 0.5:
            exponent -= 1
        scale = 10**(-exponent)
        vmin = numerix.floor(scale * vmin) / scale
        vmax = numerix.ceil(scale * vmax) / scale

        return nonsingular(vmin, vmax)
    def autoscale(self):
        'Try to choose the view limits intelligently'
        self.verify_intervals()
        vmin, vmax = self.dataInterval.get_bounds()

        if vmax<vmin:
            vmin, vmax = vmax, vmin

        if vmax * vmin > 0:
            raise ValueError("The interval must range from negative to positive values")

        if vmax == self.threshold:
            vmax += 1
        if vmin == -self.threshold:
            vmin -= 1

        exponent, remainder = divmod(numerix.log10(vmax - vmin), 1)

        if remainder < 0.5:
            exponent -= 1
        scale = 10**(-exponent)
        vmin = numerix.floor(scale*vmin) / scale
        vmax = numerix.ceil(scale*vmax) / scale

        return nonsingular(vmin, vmax)
    def _plot(self):

        var = self.vars[0]
        mesh = var.mesh

        U, V = var.numericValue

        U = numerix.take(U, self.indices)
        V = numerix.take(V, self.indices)
        
        ang = numerix.arctan2(V, U)
        mag = numerix.sqrt(U**2 + V**2)
        
        datamin, datamax = self._autoscale(vars=(mag,),
                                           datamin=self._getLimit('datamin'),
                                           datamax=self._getLimit('datamax'))
        
        mag = numerix.where(mag > datamax, datamax, mag)
        mag = numerix.ma.masked_array(mag, mag < datamin)
        
        if self.log:
            mag = numerix.log10(mag)
            mag = numerix.ma.masked_array(mag, numerix.isnan(mag))
            
        U = mag * numerix.cos(ang)
        V = mag * numerix.sin(ang)

        self._quiver.set_UVC(U, V)
        
        self.axes.set_xlim(xmin=self._getLimit('xmin'),
                           xmax=self._getLimit('xmax'))
        self.axes.set_ylim(ymin=self._getLimit('ymin'),
                           ymax=self._getLimit('ymax'))
    def _plot(self):
        from scipy.interpolate import griddata

        var = self.vars[0]
        mesh = var.mesh

        xmin, ymin = mesh.extents['min']
        xmax, ymax = mesh.extents['max']

        N = 100
        X = numerix.linspace(xmin, xmax, N)
        Y = numerix.linspace(ymin, ymax, N)

        grid_x, grid_y = numerix.mgrid[xmin:xmax:N * 1j, ymin:ymax:N * 1j]

        if isinstance(var, FaceVariable):
            C = mesh.faceCenters
        elif isinstance(var, CellVariable):
            C = mesh.cellCenters

        U = griddata(C.value.T, var.value[0], (grid_x, grid_y), method='cubic')
        V = griddata(C.value.T, var.value[1], (grid_x, grid_y), method='cubic')

        lw = self.linewidth
        if isinstance(lw, (FaceVariable, CellVariable)):
            lw = griddata(C.value.T,
                          lw.value, (grid_x, grid_y),
                          method='cubic')

        color = self.color
        if isinstance(color, (FaceVariable, CellVariable)):
            color = griddata(C.value.T,
                             color.value, (grid_x, grid_y),
                             method='cubic',
                             fill_value=color.min())

        U = U.T
        V = V.T

        ang = numerix.arctan2(V, U)
        mag = numerix.sqrt(U**2 + V**2)

        datamin, datamax = self._autoscale(vars=(mag, ),
                                           datamin=self._getLimit('datamin'),
                                           datamax=self._getLimit('datamax'))

        mag = numerix.where(mag > datamax, numerix.nan, mag)
        mag = numerix.where(mag < datamin, numerix.nan, mag)

        if self.log:
            mag = numerix.log10(mag)

        U = mag * numerix.cos(ang)
        V = mag * numerix.sin(ang)

        #         if self._stream is not None:
        #             # the following doesn't work, nor does it help to `add_collection` first
        #             # self._stream.arrows.remove()
        #             self._stream.lines.remove()

        self.axes.cla()
        self._stream = self.axes.streamplot(X,
                                            Y,
                                            U,
                                            V,
                                            linewidth=lw,
                                            color=color,
                                            **self.kwargs)

        self.axes.set_xlim(xmin=self._getLimit('xmin'),
                           xmax=self._getLimit('xmax'))
        self.axes.set_ylim(ymin=self._getLimit('ymin'),
                           ymax=self._getLimit('ymax'))
 def signed_to_logs(v):
     return (numerix.where(v > 0, numerix.log10(v), numerix.nan),
             numerix.where(v < 0, numerix.log10(-v), numerix.nan))
Exemple #7
0
 def log10(self):
     return self._UnaryOperatorVariable(lambda a: numerix.log10(a))
 def signed_to_logs(v):
     return (numerix.where(v > 0, numerix.log10(v), numerix.nan),
             numerix.where(v < 0, numerix.log10(-v), numerix.nan))
    def plot(self, matrix, RHSvector, log='auto'):
        import tempfile
        import os
        
        (f, mtxName) = tempfile.mkstemp(suffix='.mtx')
        matrix.exportMmf(mtxName)
        mtx = mmio.mmread(mtxName)
##         f.close()
        os.remove(mtxName)
        
        pylab.ion()
        
        c = mtx.tocoo()
        y = c.row
        x = c.col
        z = c.data
        
        b = RHSvector
        
        if len(z) == 0:
            y = zeros((1,))
            x = zeros((1,))
            z = zeros((1,))

        zPlus = where(z > 0, log10(z), nan)
        zMinus = where(z < 0, log10(-z), nan)
        bPlus = where(b > 0, log10(b), nan)
        bMinus = where(b < 0, log10(-b), nan)

        if (log == True
            or (log == 'auto' 
                and (max(zPlus) - min(zPlus) > 2
                     or max(zMinus) - min(zMinus) > 2
                     or max(bPlus) - min(bPlus) > 2
                     or max(bMinus) - min(bMinus) > 2))):
            log = True
        else:
            log = False
            
        if log:
            zMin = nanmin((nanmin(zPlus), nanmin(zMinus), nanmin(bPlus), nanmin(bMinus)))
            zMax = nanmax((nanmax(zPlus), nanmax(zMinus), nanmax(bPlus), nanmax(bMinus)))
##             zThreshold = 0.5 # (zMax - zMin) / 5.
            
            zMin -= 0.5
            
            numdec = math.floor(zMax)-math.ceil(zMin)
            if numdec < 0:
                zMax += 0.5
            
            zPlus -= zMin
            zMinus -= zMin
            bPlus -= zMin
            bMinus -= zMin
            zRange = zMax - zMin
            
            if zRange == 0:
                zRange = nanmax(zPlus) + 1

            z = where(z > 0, zPlus, -zMinus)
            z = where(isnan(z), 0., z)
            b = where(b > 0, bPlus, -bMinus)
            b = where(isnan(b), 0., b)

            fmt = SignedLogFormatter(threshold=zMin)
            loc = SignedLogLocator(threshold=zMin)
            
        else:
            zRange = max(max(abs(z)), max(abs(b)))
        
            if zRange == 0:
                zRange = 1

            fmt = None
            loc = None
            

        N = matrix._getShape()[0]
        saveSize = pylab.rcParams['figure.figsize']
        size = pylab.rcParams['figure.dpi'] **2 * saveSize[0] * saveSize[1] / N**2

        pylab.ioff()
        
        pylab.figure(self.id)
        pylab.clf()

        pylab.delaxes()
        ax1 = pylab.axes([self.margin, self.margin, self.width, self.width])
        
        Mscat = pylab.scatter(x, y, c=z, 
                              vmin=-zRange, vmax=zRange, edgecolors='none', 
                              cmap=pylab.get_cmap('RdBu'), marker='s', s=size)
                             
        ax2 = pylab.axes([self.width + self.margin, self.margin, (self.width / self.aspect) / N, self.width], 
                         sharey=ax1)

        bscat = pylab.scatter(zeros((N,)), arange(N), c=b, 
                              vmin=-zRange, vmax=zRange, edgecolors='none', 
                              cmap=pylab.get_cmap('RdBu'), marker='s', s=size)

        pylab.setp((ax2.get_xticklabels(),
                    ax2.get_yticklabels(),
                    ax2.get_xticklines(),
                    ax2.get_yticklines()), visible=False)
        
        pylab.axes(ax1)
        pylab.axis([-0.5, N - 0.5, N - 0.5, -0.5])

        pylab.colorbar(format=fmt, ticks=loc)

        pylab.title(self.title)

        pylab.draw()