On 2012/11/26 11:37 AM, TP wrote:
> 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.)

I'm glad you found a solution, but my sense is that the problem is that 
you are trying to make the colormap do the work of the norm.  The 
colormap is just a set of discrete colors, with a linear mapping to the 
0-1 scale (apart from the special under, over, and invalid values).  The 
norm is for mapping your data to those colors, however you like, by 
mapping your data to the 0-1 range (again with possible under, over, and 
invalid values).  Did you consider making a custom norm instead of 
modifying the colormap?

Eric

>
> #####################
> 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
>


------------------------------------------------------------------------------
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

Reply via email to