2

我正在尝试运行 Scipy Cook Book 中的示例,但无法运行。

我正在使用 python 2.7(Numpy 版本 1.6.2,Matplotlib 1.1.1)

代码位于

http://www.scipy.org/Cookbook/Matplotlib/Plotting_Images_with_Special_Values

    from matplotlib.colors import Colormap, normalize
    #import matplotlib.numerix as nx  #In original code changed to numpy in line below
    import numpy as nx
    from types import IntType, FloatType, ListType

    class SentinelMap(Colormap):
            def __init__(self, cmap, sentinels={}):
                    # boilerplate stuff
                    self.N = cmap.N
                    self.name = 'SentinelMap'
                    self.cmap = cmap
                    self.sentinels = sentinels
                    for rgb in sentinels.values():
                            if len(rgb)!=3:
                                    raise ValueError('sentinel color must be RGB')


            def __call__(self, scaledImageData, alpha=1):
                    # assumes the data is already normalized (ignoring sentinels)
                    # clip to be on the safe side
                    rgbaValues = self.cmap(nx.clip(scaledImageData, 0.,1.))

                    #replace sentinel data with sentinel colors
                    for sentinel,rgb in self.sentinels.items():
                            r,g,b = rgb
                            rgbaValues[:,:,0] =  nx.where(scaledImageData==sentinel, r, rgbaValues[:,:,0])
                            rgbaValues[:,:,1] =  nx.where(scaledImageData==sentinel, g, rgbaValues[:,:,1])
                            rgbaValues[:,:,2] =  nx.where(scaledImageData==sentinel, b, rgbaValues[:,:,2])
                            rgbaValues[:,:,3] =  nx.where(scaledImageData==sentinel, alpha, rgbaValues[:,:,3])

                    return rgbaValues

    class SentinelNorm(normalize):
            """
            Leave the sentinel unchanged
            """
            def __init__(self, ignore=[], vmin=None, vmax=None):
                    self.vmin=vmin
                    self.vmax=vmax

                    if type(ignore) in [IntType, FloatType]:
                            self.ignore = [ignore]
                    else:
                            self.ignore = list(ignore)


            def __call__(self, value):

                    vmin = self.vmin
                    vmax = self.vmax

                    if type(value) in [IntType, FloatType]:
                            vtype = 'scalar'
                            val = array([value])
                    else:
                            vtype = 'array'
                            val = nx.asarray(value)

                    # if both vmin is None and vmax is None, we'll automatically
                    # norm the data to vmin/vmax of the actual data, so the
                    # clipping step won't be needed.
                    if vmin is None and vmax is None:
                            needs_clipping = False
                    else:
                            needs_clipping = True

                    if vmin is None or vmax is None:
                            rval = nx.ravel(val)
                            #do this if sentinels (values to ignore in data)
                            if self.ignore:
                                    sortValues=nx.sort(rval)
                                    if vmin is None:
                                            # find the lowest non-sentinel value
                                            for thisVal in sortValues:
                                                    if thisVal not in self.ignore:
                                                            vmin=thisVal #vmin is the lowest non-sentinel value
                                                            break
                                            else:
                                                    vmin=0.
                                    if vmax is None:
                                            for thisVal in sortValues[::-1]:
                                                    if thisVal not in self.ignore:
                                                            vmax=thisVal #vmax is the greatest non-sentinel value
                                                            break
                                            else:
                                                    vmax=0.
                            else:
                                    if vmin is None: vmin = min(rval)
                                    if vmax is None: vmax = max(rval)
                    if vmin > vmax:
                            raise ValueError("minvalue must be less than or equal to maxvalue")
                    elif vmin==vmax:
                            return 0.*value
                    else:
                            if needs_clipping:
                                    val = nx.clip(val,vmin, vmax)
                            result = (1.0/(vmax-vmin))*(val-vmin)

                    # replace sentinels with original (non-normalized) values
                    for thisIgnore in self.ignore:
                            result = nx.where(val==thisIgnore,thisIgnore,result)

                    if vtype == 'scalar':
                            result = result[0]
                    return result


    if __name__=="__main__":
            import pylab
            import matplotlib.colors
            n=100

            # create a random array
            #X = nx.mlab.rand(n,n) # In original cookbook code changed to line below
            X = nx.random.rand(n,n)
            cmBase = pylab.cm.jet

            # plot it array as an image
            pylab.figure(1)
            pylab.imshow(X, cmap=cmBase, interpolation='nearest')

            # define the sentinels
            sentinel1 = -10
            sentinel2 = 10

            # replace some data with sentinels
            X[int(.1*n):int(.2*n), int(.5*n):int(.7*n)]  = sentinel1
            X[int(.6*n):int(.8*n), int(.2*n):int(.3*n)]  = sentinel2

            # define the colormap and norm
            rgb1 = (0.,0.,0.)
            rgb2 = (1.,0.,0.)
            cmap = SentinelMap(cmBase, sentinels={sentinel1:rgb1,sentinel2:rgb2,})
            norm = SentinelNorm(ignore=[sentinel1,sentinel2])

            # plot with the modified colormap and norm
            pylab.figure(2)
            pylab.imshow(X, cmap = cmap, norm=norm, interpolation='nearest')

            pylab.show()

但是,我收到一条错误消息

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
        return self.func(*args)
      File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 236, in resize
        self.show()
      File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 239, in draw
        FigureCanvasAgg.draw(self)
      File "C:\Python27\lib\site-packages\matplotlib\backends\backend_agg.py", line 421, in draw
        self.figure.draw(self.renderer)
      File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "C:\Python27\lib\site-packages\matplotlib\figure.py", line 898, in draw
        func(*args)
      File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 1997, in draw
        a.draw(renderer)
      File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "C:\Python27\lib\site-packages\matplotlib\image.py", line 350, in draw
        im = self.make_image(renderer.get_image_magnification())
      File "C:\Python27\lib\site-packages\matplotlib\image.py", line 569, in make_image
        transformed_viewLim)
      File "C:\Python27\lib\site-packages\matplotlib\image.py", line 201, in _get_unsampled_image
        x = self.to_rgba(self._A, bytes=True)
      File "C:\Python27\lib\site-packages\matplotlib\cm.py", line 214, in to_rgba

网络搜索使我找到了有关它的评论,但是没有任何用处。

http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg19249.html

希望有人可以帮助我理解问题并找出错误。

4

0 回答 0