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

Reply via email to