[matplotlib-devel] quiver color problem From: Pierre Bayerl - 2005-10-26 13:00 ```Hi I have found a problem when using external color information to color the arrows in a quiver-plot. I found that the norm-option does not affect the output. Here is the code I chanegd to fix this problem (3 lines, marked with a #PI). Pierre --- fragment of file axes.py: --- def quiver(self, U, V, *args, **kwargs ): """ QUIVER( X, Y, U, V ) QUIVER( U, V ) QUIVER( X, Y, U, V, S) QUIVER( U, V, S ) QUIVER( ..., color=None, width=1.0, cmap=None,norm=None ) Make a vector plot (U, V) with arrows on a grid (X, Y) The optional arguments color and width are used to specify the color and width of the arrow. color can be an array of colors in which case the arrows can be colored according to another dataset. If cm is specied and color is None, the colormap is used to give a color according to the vector's length. If color is a scalar field, the colormap is used to map the scalar to a color If a colormap is specified and color is an array of color triplets, then the colormap is ignored width is a scalar that controls the width of the arrows if S is specified it is used to scale the vectors. Use S=0 to disable automatic scaling. If S!=0, vectors are scaled to fit within the grid and then are multiplied by S. """ if not self._hold: self.cla() do_scale = True S = 1.0 if len(args)==0: # ( U, V ) U = asarray(U) V = asarray(V) X,Y = meshgrid( arange(U.shape[1]), arange(U.shape[0]) ) elif len(args)==1: # ( U, V, S ) U = asarray(U) V = asarray(V) X,Y = meshgrid( arange(U.shape[1]), arange(U.shape[0]) ) S = float(args[0]) do_scale = ( S != 0.0 ) elif len(args)==2: # ( X, Y, U, V ) X = asarray(U) Y = asarray(V) U = asarray(args[0]) V = asarray(args[1]) elif len(args)==3: # ( X, Y, U, V ) X = asarray(U) Y = asarray(V) U = asarray(args[0]) V = asarray(args[1]) S = float(args[2]) do_scale = ( S != 0.0 ) assert U.shape == V.shape assert X.shape == Y.shape assert U.shape == X.shape arrows = [] N = sqrt( U**2+V**2 ) if do_scale: Nmax = maximum.reduce(maximum.reduce(N)) U *= (S/Nmax) V *= (S/Nmax) N /= Nmax alpha = kwargs.get('alpha', 1.0) width = kwargs.get('width', 0.25) norm = kwargs.get('norm', None) cmap = kwargs.get('cmap', None) vmin = kwargs.get('vmin', None) vmax = kwargs.get('vmax', None) color = kwargs.get('color', None) shading = kwargs.get('shading', 'faceted') C = None I,J = U.shape colorarrayflag = False #PI if color is not None and not looks_like_color(color): clr = asarray(color) if clr.shape==U.shape: C = array([ clr[i,j] for i in xrange(I) for j in xrange(J)]) colorarrayflag = True #PI elif clr.shape == () and color: # a scalar (1, True,...) C = array([ N[i,j] for i in xrange(I) for j in xrange(J)]) else: color = (0.,0.,0.,1.) elif color is None: color = (0.,0.,0.,1.) else: color = colorConverter.to_rgba( color, alpha ) arrows = [ Arrow(X[i,j],Y[i,j],U[i,j],V[i,j],0.1*S ).get_verts() for i in xrange(I) for j in xrange(J) ] collection = PolyCollection( arrows, edgecolors = 'None', facecolors = (color,), antialiaseds = (0,), linewidths = (width,), ) if C is not None: collection.set_array( C ) else: collection.set_facecolor( (color,) ) collection.set_cmap(cmap) collection.set_norm(norm) if norm is not None and colorarrayflag==False: # PI collection.set_clim( vmin, vmax ) self.add_collection( collection ) lims = asarray(arrows) _max = maximum.reduce( maximum.reduce( lims )) _min = minimum.reduce( minimum.reduce( lims )) self.update_datalim( [ tuple(_min), tuple(_max) ] ) self.autoscale_view() return arrows ```