 # quiver color problem

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), arange(U.shape) )
elif len(args)==1:
# ( U, V, S )
U = asarray(U)
V = asarray(V)
X,Y = meshgrid( arange(U.shape), arange(U.shape) )
S = float(args)
do_scale = ( S != 0.0 )
elif len(args)==2:
# ( X, Y, U, V )
X = asarray(U)
Y = asarray(V)
U = asarray(args)
V = asarray(args)
elif len(args)==3:
# ( X, Y, U, V )
X = asarray(U)
Y = asarray(V)
U = asarray(args)
V = asarray(args)
S = float(args)
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)

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 )