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))
def log10(self): return self._UnaryOperatorVariable(lambda a: numerix.log10(a))
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()