On Thursday, November 22, 2012 23:51:08 TP wrote: > Thus it seems to me that my dummy example given in the previous post covers > exactly the problem encountered in my real-world imshow function. > > Is there a memory-efficient workaround in my dummy example (instead of > increasing N)?
I have modified LinearSegmentedColormap so as to solve my problem. The difference is that I do not create an huge array in my test case, but instead I interpolate linearly in the colormap. This is a quick and dirty code that does work in my case, but which does not deal with all cases (no management of transparency, no discontinuity in the colormap, etc.) ##################### from __future__ import division from pylab import * from matplotlib.colors import LinearSegmentedColormap from matplotlib.collections import CircleCollection from scipy.interpolate import interp1d class ContinuousLinearSegmentedColormap( LinearSegmentedColormap ): def __init__(self, name, segmentdata, gamma=1.0): LinearSegmentedColormap.__init__( self , name, segmentdata, gamma = gamma ) def _init(self): self.N = len( self._segmentdata['red'] ) self._lut = np.ones((self.N, 5), np.float) for i in range( self.N ): self._lut[i, 0] = self._segmentdata['red'][i][0] # 2 because I do not manage discontinuities in color self._lut[i, 1] = self._segmentdata['red'][i][2] self._lut[i, 2] = self._segmentdata['green'][i][2] self._lut[i, 3] = self._segmentdata['blue'][i][2] self._isinit = True def __call__(self, X, alpha=None, bytes=False): if not self._isinit: self._init() mask_bad = None if not cbook.iterable(X): vtype = 'scalar' xa = np.array([X]) else: vtype = 'array' xma = ma.array(X, copy=False) mask_bad = xma.mask xa = xma.data.copy() # Copy here to avoid side effects. del xma lut = self._lut.copy() rgba = np.empty(shape=xa.shape+(4,), dtype=lut.dtype) # We construct interpolation functions. fred = interp1d( lut[:,0], lut[:,1]) fgreen = interp1d( lut[:,0], lut[:,2]) fblue = interp1d( lut[:,0], lut[:,3]) rgba[:,3] = 1 # alpha=1 for the time being for i in range( xa.shape[0] ): rgba[i,0] = fred( xa[i] ) rgba[i,1] = fgreen( xa[i] ) rgba[i,2] = fblue( xa[i] ) if vtype == 'scalar': rgba = tuple(rgba[0,:]) return rgba ioff() large_value = 257 # blue above this value large_value = 258 # black above this value large_value = 1e8 cdict = { 'blue': [(0.0, 0.0, 0.0) , (2*1/large_value, 1, 1) , (1.0, 1.0, 1.0)] , 'green': [(0.0, 0.0, 0.0) , (2*1/large_value, 0, 0) , (1.0, 1.0, 1.0)] , 'red': [(0.0, 0.0, 0.0) , (2*1/large_value, 0, 0) , (1.0, 1.0, 1.0)] } measures= array( [[ 0.2, 0.3, 0], [ 0.3, 0.4, 2], [ 0.5, 0.6, large_value]] ) cmap = ContinuousLinearSegmentedColormap( "cmap foobar" , cdict ) fig = figure() axes = fig.add_subplot(111) ec = CircleCollection( [80] , offsets = measures[:,:2] , transOffset = axes.transData ) ec.set_array( measures[:,2] ) ec.set_cmap( cmap ) axes.add_collection( ec ) show() ##################### ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users