Arrowheads for axis in Matplotlib
25 May 2014
This is a short demo showing how to make abstract plots in matplotlib that have arrows pointing in the x and y direction as axis.
The idea is to remove the default axis completely and insert arrows with the correct dimensions as substitute axis:
import pylab as pl fig = pl.figure() ax = fig.add_subplot(111) x = pl.arange(-5,5,0.1) ax.plot(x, x**2-8.8) xmin, xmax = ax.get_xlim() ymin, ymax = ax.get_ylim() # removing the default axis on all sides: for side in ['bottom','right','top','left']: ax.spines[side].set_visible(False) # removing the axis ticks pl.xticks([]) # labels pl.yticks([]) ax.xaxis.set_ticks_position('none') # tick markers ax.yaxis.set_ticks_position('none') # wider figure for demonstration fig.set_size_inches(4,2.2) # get width and height of axes object to compute # matching arrowhead length and width dps = fig.dpi_scale_trans.inverted() bbox = ax.get_window_extent().transformed(dps) width, height = bbox.width, bbox.height # manual arrowhead width and length hw = 1./20.*(ymax-ymin) hl = 1./20.*(xmax-xmin) lw = 1. # axis line width ohg = 0.3 # arrow overhang # compute matching arrowhead length and width yhw = hw/(ymax-ymin)*(xmax-xmin)* height/width yhl = hl/(xmax-xmin)*(ymax-ymin)* width/height # draw x and y axis ax.arrow(xmin, 0, xmax-xmin, 0., fc='k', ec='k', lw = lw, head_width=hw, head_length=hl, overhang = ohg, length_includes_head= True, clip_on = False) ax.arrow(0, ymin, 0., ymax-ymin, fc='k', ec='k', lw = lw, head_width=yhw, head_length=yhl, overhang = ohg, length_includes_head= True, clip_on = False) # clip_on = False if only positive x or y values. pl.savefig('arrow_axis.png', dpi = 300)