def plotMesh(self, filename=None): self._plot() faceVertexIDs = self.mesh.faceVertexIDs vertexCoords = self.mesh.vertexCoords x0 = numerix.take(vertexCoords[0], faceVertexIDs[0]) y0 = numerix.take(vertexCoords[1], faceVertexIDs[0]) x1 = numerix.take(vertexCoords[0], faceVertexIDs[1]) y1 = numerix.take(vertexCoords[1], faceVertexIDs[1]) import gist gist.pldj(x0, y0, x1, y1) if filename is not None: import os.path root, ext = os.path.splitext(filename) if ext.lower() in (".eps", ".epsi"): gist.eps(root) else: gist.hcp_file(filename, dump=1) gist.hcp() gist.hcp_finish(-1) gist.fma()
def plotMesh(self, filename = None): self._plot() faceVertexIDs = self.mesh.faceVertexIDs vertexCoords = self.mesh.vertexCoords x0 = numerix.take(vertexCoords[0], faceVertexIDs[0]) y0 = numerix.take(vertexCoords[1], faceVertexIDs[0]) x1 = numerix.take(vertexCoords[0], faceVertexIDs[1]) y1 = numerix.take(vertexCoords[1], faceVertexIDs[1]) import gist gist.pldj(x0, y0, x1, y1) if filename is not None: import os.path root, ext = os.path.splitext(filename) if ext.lower() in (".eps", ".epsi"): gist.eps(root) else: gist.hcp_file(filename, dump = 1) gist.hcp() gist.hcp_finish(-1) gist.fma()
def arrow(x0,y0,x1,y1,color=0,ang=45.0,height=6,width=1.5,lc=None): """Draw an arrow. Description: Draw an arrow from (x0,y0) to (x1,y1) in the current coordinate system. Inputs: x0, y0 -- The beginning point. x1, y1 -- Then ending point. color -- The color of the arrowhead. Number represents an index in the current palette or a negative number or a spelled out basic color. lc -- The color of the line (same as color by default). ang -- The angle of the arrowhead. height -- The height of the arrowhead in points. width -- The width of the arrow line in points. """ if lc is None: lc = color if type(lc) is types.StringType: lc = _colornum[lc] if type(color) is types.StringType: color = _colornum[color] vp = gist.viewport() plotlims = gist.limits() gist.limits(plotlims) conv_factorx = (vp[1]-vp[0]) / (plotlims[1]-plotlims[0]) conv_factory = (vp[3]-vp[2]) / (plotlims[3]-plotlims[2]) ang = ang*pi/180 height = height*points hypot = height / cos(ang) difx = (x1 - x0) * conv_factorx dify = (y1 - y0) * conv_factory theta = arctan2(dify,difx) + pi tha = theta + ang thb = theta - ang x1a = x1 + hypot*cos(tha) / conv_factorx x1b = x1 + hypot*cos(thb) / conv_factorx y1a = y1 + hypot*sin(tha) / conv_factory y1b = y1 + hypot*sin(thb) / conv_factory gist.pldj([x0],[y0],[x1],[y1],color=lc,width=width) gist.plfp(array([color],'B'),[y1,y1a,y1b],[x1,x1a,x1b],[3]) return
def stem(m, y, linetype='b-', mtype='mo', shift=0.013): y0 = Numeric.zeros(len(y),y.dtype.char) y1 = y x0 = m x1 = m try: override = 1 savesys = gist.plsys(2) gist.plsys(savesys) except: override = 0 if not (_hold or override): gist.fma() thetype,thecolor,themarker,tomark = _parse_type_arg(linetype,0) lcolor = thecolor gist.pldj(x0, y0, x1, y1, color=thecolor, type=thetype) thetype,thecolor,themarker,tomark = _parse_type_arg(mtype,0) if themarker not in ['o','x','.','*']: themarker = 'o' y = where(numpy.isfinite(y),y,0) gist.plg(y,m,color=thecolor,marker=themarker,type='none') gist.plg(Numeric.zeros(len(m)),m,color=lcolor,marks=0) gist.limits() lims = gist.limits() newlims = [None]*4 vp = gist.viewport() factor1 = vp[1] - vp[0] factor2 = vp[3] - vp[2] cfactx = factor1 / (lims[1] - lims[0]) cfacty = factor2 / (lims[3] - lims[2]) d1 = shift / cfactx d2 = shift / cfacty newlims[0] = lims[0] - d1 newlims[1] = lims[1] + d1 newlims[2] = lims[2] - d2 newlims[3] = lims[3] + d2 gist.limits(*newlims) return
def stem(m, y, linetype='b-', mtype='mo', shift=0.013): y0 = numpy.zeros(len(y),y.dtype.char) y1 = y x0 = m x1 = m try: override = 1 savesys = gist.plsys(2) gist.plsys(savesys) except: override = 0 if not (_hold or override): gist.fma() thetype,thecolor,themarker,tomark = _parse_type_arg(linetype,0) lcolor = thecolor gist.pldj(x0, y0, x1, y1, color=thecolor, type=thetype) thetype,thecolor,themarker,tomark = _parse_type_arg(mtype,0) if themarker not in ['o','x','.','*']: themarker = 'o' y = where(numpy.isfinite(y),y,0) gist.plg(y,m,color=thecolor,marker=themarker,type='none') gist.plg(numpy.zeros(len(m)),m,color=lcolor,marks=0) gist.limits() lims = gist.limits() newlims = [None]*4 vp = gist.viewport() factor1 = vp[1] - vp[0] factor2 = vp[3] - vp[2] cfactx = factor1 / (lims[1] - lims[0]) cfacty = factor2 / (lims[3] - lims[2]) d1 = shift / cfactx d2 = shift / cfacty newlims[0] = lims[0] - d1 newlims[1] = lims[1] + d1 newlims[2] = lims[2] - d2 newlims[3] = lims[3] + d2 gist.limits(*newlims) return
def errorbars(x,y,err,ptcolor='r',linecolor='B',pttype='o',linetype='-',fac=0.25): """Draw connected points with errorbars. Description: Plot connected points with errorbars. Inputs: x, y -- The points to plot. err -- The error in the y values. ptcolor -- The color for the points. linecolor -- The color of the connecting lines and error bars. pttype -- The type of point ('o', 'x', '+', '.', 'x', '*') linetype -- The type of line ('-', '|', ':', '-.', '-:') fac -- Adjusts how long the horizontal lines are which make the top and bottom of the error bars. """ # create line arrays yb = y - err ye = y + err try: override = 1 savesys = gist.plsys(2) gist.plsys(savesys) except: override = 0 if _hold or override: pass else: gist.fma() y = where(numpy.isfinite(y),y,0) gist.plg(y,x,color=_colors[ptcolor],marker=_markers[pttype],type='none') gist.pldj(x,yb,x,ye,color=_colors[linecolor],type=_types[linetype]) viewp = gist.viewport() plotlims = gist.limits() conv_factorx = (viewp[1] - viewp[0]) / (plotlims[1]-plotlims[0]) conv_factory = (viewp[3] - viewp[2]) / (plotlims[3]-plotlims[2]) width = fac*(x[1]-x[0]) x0 = x-width/2.0 x1 = x+width/2.0 gist.pldj(x0,ye,x1,ye,color=_colors[linecolor],type=_types[linetype]) gist.pldj(x0,yb,x1,yb,color=_colors[linecolor],type=_types[linetype]) return
def run(arrow_scales=True): gist.fma() # generate a random field test_dim=10 dx=numpy.random.rand(test_dim**2)-0.5 dy=numpy.random.rand(test_dim**2)-0.5 p=numpy.indices((test_dim,test_dim)) x=p[0].ravel() y=p[1].ravel() X1=x Y1=y X2=x+dx Y2=y+dy gist.pldj(X1,Y1,X2,Y2) arrow_a = numpy.pi/6. arrow_len = .5 slo=(Y2-Y1)/(X2-X1) ang=numpy.arctan(slo) ang1=ang+arrow_a ang2=ang-arrow_a if arrow_scales: ar_=numpy.sign(X2-X1)*arrow_len*((X2-X1)**2+(Y2-Y1)**2) aX1=X2-ar_*numpy.cos(ang1) aY1=Y2-ar_*numpy.sin(ang1) aX2=X2-ar_*numpy.cos(ang2) aY2=Y2-ar_*numpy.sin(ang2) else: ar_=numpy.sign(X2-X1)*arrow_len*numpy.max(((X2-X1)**2+(Y2-Y1)**2)**.5) aX1=X2-ar_*numpy.cos(ang1) aY1=Y2-ar_*numpy.sin(ang1) aX2=X2-ar_*numpy.cos(ang2) aY2=Y2-ar_*numpy.sin(ang2) gist.pldj(X2,Y2,aX1,aY1,color='red') gist.pldj(X2,Y2,aX2,aY2,color='red') gist.limits()
def plot_cross(x,y,sz=1,color='red'): gist.pldj([x],[y-sz],[x],[y+sz],color=color) gist.pldj([x-sz],[y],[x+sz],[y],color=color)
def addbox(x0,y0,x1,y1,color='black',width=1,type='-'): if not isinstance(color,types.IntType): color = _colornum[color] wordtype = _types[type] gist.pldj([x0,x1,x1,x0],[y0,y0,y1,y1],[x1,x1,x0,x0],[y0,y1,y1,y0], color=color,type=wordtype,width=width)
def legend(text,linetypes=None,lleft=None,color=None,tfont='helvetica',fontsize=14,nobox=0): """Construct and place a legend. Description: Build a legend and place it on the current plot with an interactive prompt. Inputs: text -- A list of strings which document the curves. linetypes -- If not given, then the text strings are associated with the curves in the order they were originally drawn. Otherwise, associate the text strings with the corresponding curve types given. See plot for description. """ global _hold global _textcolor if color is None: color = _textcolor else: _textcolor = color if color is None: color = 'black' sys = gist.plsys() if sys == 0: gist.plsys(1) viewp = gist.viewport() gist.plsys(sys) DX = viewp[1] - viewp[0] DY = viewp[3] - viewp[2] width = DY / 10.0; if lleft is None: lleft = gist.mouse(0,0,"Click on point for lower left coordinate.") llx = lleft[0] lly = lleft[1] else: llx,lly = lleft[:2] savesys = gist.plsys() dx = width / 3.0 legarr = numpy.arange(llx,llx+width,dx) legy = numpy.ones(legarr.shape) dy = fontsize*points*1.2 deltay = fontsize*points / 2.8 deltax = fontsize*points / 2.6 * DX / DY ypos = lly + deltay; if linetypes is None: linetypes = _GLOBAL_LINE_TYPES[:] # copy them out gist.plsys(0) savehold = _hold _hold = 1 for k in range(len(text)): plot(legarr,ypos*legy,linetypes[k]) print linetypes[k], text[k] print llx+width+deltax, ypos-deltay if text[k] != "": gist.plt(text[k],llx+width+deltax,ypos-deltay, color=color,font=tfont,height=fontsize,tosys=0) ypos = ypos + dy _hold = savehold if nobox: pass else: gist.plsys(0) maxlen = numpy.max(map(len,text)) c1 = (llx-deltax,lly-deltay) c2 = (llx + width + deltax + fontsize*points* maxlen/1.8 + deltax, lly + len(text)*dy) linesx0 = [c1[0],c1[0],c2[0],c2[0]] linesy0 = [c1[1],c2[1],c2[1],c1[1]] linesx1 = [c1[0],c2[0],c2[0],c1[0]] linesy1 = [c2[1],c2[1],c1[1],c1[1]] gist.pldj(linesx0,linesy0,linesx1,linesy1,color=color) gist.plsys(savesys) return
def legend(text,linetypes=None,lleft=None,color=None,tfont='helvetica',fontsize=14,nobox=0): """Construct and place a legend. Description: Build a legend and place it on the current plot with an interactive prompt. Inputs: text -- A list of strings which document the curves. linetypes -- If not given, then the text strings are associated with the curves in the order they were originally drawn. Otherwise, associate the text strings with the corresponding curve types given. See plot for description. """ global _hold global _textcolor if color is None: color = _textcolor else: _textcolor = color if color is None: color = 'black' sys = gist.plsys() if sys == 0: gist.plsys(1) viewp = gist.viewport() gist.plsys(sys) DX = viewp[1] - viewp[0] DY = viewp[3] - viewp[2] width = DY / 10.0; if lleft is None: lleft = gist.mouse(0,0,"Click on point for lower left coordinate.") llx = lleft[0] lly = lleft[1] else: llx,lly = lleft[:2] savesys = gist.plsys() dx = width / 3.0 legarr = Numeric.arange(llx,llx+width,dx) legy = Numeric.ones(legarr.shape) dy = fontsize*points*1.2 deltay = fontsize*points / 2.8 deltax = fontsize*points / 2.6 * DX / DY ypos = lly + deltay; if linetypes is None: linetypes = _GLOBAL_LINE_TYPES[:] # copy them out gist.plsys(0) savehold = _hold _hold = 1 for k in range(len(text)): plot(legarr,ypos*legy,linetypes[k]) print linetypes[k], text[k] print llx+width+deltax, ypos-deltay if text[k] != "": gist.plt(text[k],llx+width+deltax,ypos-deltay, color=color,font=tfont,height=fontsize,tosys=0) ypos = ypos + dy _hold = savehold if nobox: pass else: gist.plsys(0) maxlen = MLab.max(map(len,text)) c1 = (llx-deltax,lly-deltay) c2 = (llx + width + deltax + fontsize*points* maxlen/1.8 + deltax, lly + len(text)*dy) linesx0 = [c1[0],c1[0],c2[0],c2[0]] linesy0 = [c1[1],c2[1],c2[1],c1[1]] linesx1 = [c1[0],c2[0],c2[0],c1[0]] linesy1 = [c2[1],c2[1],c1[1],c1[1]] gist.pldj(linesx0,linesy0,linesx1,linesy1,color=color) gist.plsys(savesys) return
def twoplane(DATA,slice1,slice2,dx=[1,1,1],cmin=None,cmax=None,xb=None,xe=None, xlab="",ylab="",zlab="",clab="",titl="", totalheight=0.5,space=0.02, medfilt=5, font='helvetica',fontsize=16,color='black',lcolor='white', fcolor='black', cb=1, line=1, palette=None): """ Visualize a 3d volume as a two connected slices. The slices are given in the 2-tuple slice1 and slice2. These give the dimension and corresponding slice numbers to plot. The unchosen slice is the common dimension in the images. twoplane(img3d,(0,12),(2,60)) plots two images with a common "x"-axis as the first dimension. The lower plot is img3d[12,:,:] with a line through row 60 corresponding to the slice transpose(img3d[:,:,60]) plotted above this first plot. """ if xb is None: xb = [0,0,0] if xe is None: xe = DATA.shape # get two image slices # make special style file so that pixels are square getdx = array([1,1,1]) imgsl1 = [slice(None,None),slice(None,None),slice(None,None)] imgsl1[slice1[0]] = slice1[1] img1 = DATA[imgsl1] getdx1 = getdx.__copy__() getdx1[slice1[0]] = 0 dx1 = compress(getdx1,dx,axis=-1) xb1 = compress(getdx1,xb,axis=-1) xe1 = compress(getdx1,xe,axis=-1) imgsl2 = [slice(None,None),slice(None,None),slice(None,None)] imgsl2[slice2[0]] = slice2[1] img2 = DATA[imgsl2] getdx2 = getdx.__copy__() getdx2[slice2[0]] = 0 dx2 = compress(getdx2,dx,axis=-1) xb2 = compress(getdx2,xb,axis=-1) xe2 = compress(getdx2,xe,axis=-1) if (slice1[0] == slice2[0]): raise ValueError, "Same slice dimension.." for k in range(3): if k not in [slice1[0],slice2[0]]: samedim = k break if samedim == 2: pass elif samedim == 1: if samedim > slice1[0]: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] if samedim > slice2[0]: img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] else: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] assert(img1.shape[1] == img2.shape[1]) units = totalheight - space totaldist = img1.shape[0]*dx1[0] + img2.shape[0]*dx2[0] convfactor = units / float(totaldist) height1 = img1.shape[0]*dx1[0] * convfactor xwidth = img1.shape[1]*dx1[1]*convfactor if xwidth > 0.6: rescale = 0.6 / xwidth xwidth = rescale * xwidth height1 = rescale * height1 totalheight = totalheight * rescale print xwidth, height1 else: print xwidth ystart = 0.5 - totalheight / 2 ypos1 = [ystart, ystart+height1] ypos2 = [ystart+height1+space,ystart+totalheight] xpos = [0.395-xwidth/2.0, 0.395+xwidth/2.0] systems = [] system = write_style.getsys(hticpos='', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos2[0],ypos2[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) system = write_style.getsys(hticpos='below', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos1[0],ypos1[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) the_style = os.path.join(_user_path,"two-plane.gs") write_style.writestyle(the_style,systems) gist.window(style=the_style) _current_style = the_style change_palette(palette) gist.plsys(1) if medfilt > 1: img1 = signal.medfilt(img1,[medfilt,medfilt]) img2 = signal.medfilt(img2,[medfilt,medfilt]) if cmax is None: cmax = max(max(ravel(img1)),max(ravel(img2))) if cmin is None: cmin = min(min(ravel(img1)),min(ravel(img2))) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(img2,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb2[1],xb2[0],xe2[1],xe2[0]) ylabel(zlab,color=color) if titl != "": title(titl,color=color) if line: xstart = xb2[1] xstop = xe2[1] yval = slice1[1]*(xe2[0] - xb2[0])/(img2.shape[0]) + xb2[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') gist.plsys(2) ylabel(ylab,color=color) xlabel(xlab,color=color) byteimage = gist.bytscl(img1,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb1[1],xb1[0],xe1[1],xe1[0]) if line: xstart = xb1[1] xstop = xe1[1] yval = slice2[1]*(xe1[0] - xb1[0])/(img1.shape[0]) + xb1[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') if cb: colorbar.color_bar(cmin,cmax,ncol=240,zlabel=clab,font=font,fontsize=fontsize,color=color,ymin=ystart,ymax=ystart+totalheight,xmin0=xpos[1]+0.02,xmax0=xpos[1]+0.04)
def twoplane(DATA,slice1,slice2,dx=[1,1,1],cmin=None,cmax=None,xb=None,xe=None, xlab="",ylab="",zlab="",clab="",titl="", totalheight=0.5,space=0.02, medfilt=5, font='helvetica',fontsize=16,color='black',lcolor='white', fcolor='black', cb=1, line=1, palette=None): """ Visualize a 3d volume as a two connected slices. The slices are given in the 2-tuple slice1 and slice2. These give the dimension and corresponding slice numbers to plot. The unchosen slice is the common dimension in the images. twoplane(img3d,(0,12),(2,60)) plots two images with a common "x"-axis as the first dimension. The lower plot is img3d[12,:,:] with a line through row 60 corresponding to the slice transpose(img3d[:,:,60]) plotted above this first plot. """ if xb is None: xb = [0,0,0] if xe is None: xe = DATA.shape # get two image slices # make special style file so that pixels are square getdx = array([1,1,1]) imgsl1 = [slice(None,None),slice(None,None),slice(None,None)] imgsl1[slice1[0]] = slice1[1] img1 = DATA[imgsl1] getdx1 = getdx.__copy__() getdx1[slice1[0]] = 0 dx1 = compress(getdx1,dx,axis=-1) xb1 = compress(getdx1,xb,axis=-1) xe1 = compress(getdx1,xe,axis=-1) imgsl2 = [slice(None,None),slice(None,None),slice(None,None)] imgsl2[slice2[0]] = slice2[1] img2 = DATA[imgsl2] getdx2 = getdx.__copy__() getdx2[slice2[0]] = 0 dx2 = compress(getdx2,dx,axis=-1) xb2 = compress(getdx2,xb,axis=-1) xe2 = compress(getdx2,xe,axis=-1) if (slice1[0] == slice2[0]): raise ValueError, "Same slice dimension.." for k in range(3): if k not in [slice1[0],slice2[0]]: samedim = k break if samedim == 2: pass elif samedim == 1: if samedim > slice1[0]: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] if samedim > slice2[0]: img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] else: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] assert(img1.shape[1] == img2.shape[1]) units = totalheight - space totaldist = img1.shape[0]*dx1[0] + img2.shape[0]*dx2[0] convfactor = units / float(totaldist) height1 = img1.shape[0]*dx1[0] * convfactor xwidth = img1.shape[1]*dx1[1]*convfactor if xwidth > 0.6: rescale = 0.6 / xwidth xwidth = rescale * xwidth height1 = rescale * height1 totalheight = totalheight * rescale print xwidth, height1 else: print xwidth ystart = 0.5 - totalheight / 2 ypos1 = [ystart, ystart+height1] ypos2 = [ystart+height1+space,ystart+totalheight] xpos = [0.395-xwidth/2.0, 0.395+xwidth/2.0] systems = [] system = write_style.getsys(hticpos='', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos2[0],ypos2[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) system = write_style.getsys(hticpos='below', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos1[0],ypos1[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) the_style = os.path.join(_user_path,"two-plane.gs") write_style.writestyle(the_style,systems) gist.window(style=the_style) _current_style = the_style change_palette(palette) gist.plsys(1) if medfilt > 1: import scipy.signal img1 = scipy.signal.medfilt(img1,[medfilt,medfilt]) img2 = scipy.signal.medfilt(img2,[medfilt,medfilt]) if cmax is None: cmax = max(max(ravel(img1)),max(ravel(img2))) if cmin is None: cmin = min(min(ravel(img1)),min(ravel(img2))) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(img2,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb2[1],xb2[0],xe2[1],xe2[0]) ylabel(zlab,color=color) if titl != "": title(titl,color=color) if line: xstart = xb2[1] xstop = xe2[1] yval = slice1[1]*(xe2[0] - xb2[0])/(img2.shape[0]) + xb2[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') gist.plsys(2) ylabel(ylab,color=color) xlabel(xlab,color=color) byteimage = gist.bytscl(img1,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb1[1],xb1[0],xe1[1],xe1[0]) if line: xstart = xb1[1] xstop = xe1[1] yval = slice2[1]*(xe1[0] - xb1[0])/(img1.shape[0]) + xb1[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') if cb: colorbar.color_bar(cmin,cmax,ncol=240,zlabel=clab,font=font,fontsize=fontsize,color=color,ymin=ystart,ymax=ystart+totalheight,xmin0=xpos[1]+0.02,xmax0=xpos[1]+0.04)
# generate a random field test_dim = 10 dx = numpy.random.rand(test_dim**2) - 0.5 dy = numpy.random.rand(test_dim**2) - 0.5 p = numpy.indices((test_dim, test_dim)) x = p[0].ravel() y = p[1].ravel() X1 = x Y1 = y X2 = x + dx Y2 = y + dy gist.pldj(X1, Y1, X2, Y2) arrow_a = numpy.pi / 6. arrow_len = .5 arrow_scales = False arrow_scales = True slo = (Y2 - Y1) / (X2 - X1) ang = numpy.arctan(slo) ang1 = ang + arrow_a ang2 = ang - arrow_a if arrow_scales: ar_ = numpy.sign(X2 - X1) * arrow_len * ((X2 - X1)**2 + (Y2 - Y1)**2) aX1 = X2 - ar_ * numpy.cos(ang1) aY1 = Y2 - ar_ * numpy.sin(ang1)