Opened 9 years ago

Last modified 5 years ago

#10740 new enhancement

arrows on the end of axes

Reported by: jason Owned by: jason, was
Priority: minor Milestone: sage-6.4
Component: graphics Keywords:
Cc: ppurka Merged in:
Authors: Reviewers:
Report Upstream: N/A Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Description

Here is a feature request from a post to the matplotlib mailing list: http://sourceforge.net/mailarchive/forum.php?thread_name=4D496F84.7070909%40nerim.fr&forum_name=matplotlib-users

I use matplolib by the mathematical system Sage in order to plot a function. The Sage code calls matplotlib and uses its options : The Sage command is

plot (sin, x, -5, 5)

I add labels par axes_labels or remove axes by :

plot (sin(x), x, -5, 5, axes_label = ['x', 'y']) plot (sin(x), x, -5, 5, axes=false)

French users (and maybe others) uses arrows and not lines for axes. I'm looking for a plot (sin(x), x, -5, 5, axes="arrows") Is there a pretty way to get these arrows. The result of this code isn't so fine. length, width and color don't match.

plot (sin(x), x, -5, 5, axes=false) + arrow ((-5,0),(5,0)) + arrow ((0,-1),(0,1))

What options do you propose ? I don't find relevant answers in the archive.

An answer gives some relevant matplotlib code that does this:

Hi Francois,

I'm not sure I understand - but do you want the arrows at the end of the axes spines? I don't think there's a direct way to adjust the spines to become arrows at the moment, but we can remedy that by making annotations in axes coordinates. The important thing to know here is that in axes coordinates, which are always between 0-1, spine endpoints are at these locations: (0,0), (0,1), (1,0), and (1,1). Here's the code, and attached is the resulting image

  import matplotlib.pyplot as plt
  ax = plt.subplot(1,1,1)
  
  al = 7 # arrow length in points
  arrowprops=dict(clip_on=False, # plotting outside axes on purpose
      frac=1., # make end arrowhead the whole size of arrow
      headwidth=al, # in points
      facecolor='k')
  kwargs = dict(  
                  xycoords='axes fraction',
                  textcoords='offset points',
                  arrowprops= arrowprops,
               )
  
  ax.annotate("",(1,0),xytext=(-al,0), **kwargs) # bottom spine arrow
  ax.annotate("",(0,1),xytext=(0,-al), **kwargs) # left spin arrow
  
  # hide the top and right spines
  [sp.set_visible(False) for sp in ax.spines['top'],ax.spines['right']]
  
  #hide the right and top tick marks
  ax.yaxis.tick_left()
  ax.xaxis.tick_bottom()
  
  x = np.linspace(-5,5,50)
  ax.plot(x, np.sin(x))
  
  # adjust the view a little bit
  ax.set_xlim(-5,5)
  ax.set_ylim(-1.1,1.1)
  plt.draw()

I'm not familiar with how SAGE exposes matplotlib functionality, though, since the syntax you used differs from how matplotlib is utilized.

best, -- Paul Ivanov

Change History (7)

comment:1 Changed 7 years ago by kcrisman

See also this ask.sagemath.org question. It would be nice for someone to implement e.g. axes_arrows=True or even axes_arrows=[True,False] for the different directions or something.

comment:2 Changed 7 years ago by ppurka

  • Cc ppurka added

comment:3 Changed 7 years ago by tmonteil

comment:4 Changed 6 years ago by jdemeyer

  • Milestone changed from sage-5.11 to sage-5.12

comment:5 Changed 6 years ago by vbraun_spam

  • Milestone changed from sage-6.1 to sage-6.2

comment:6 Changed 6 years ago by vbraun_spam

  • Milestone changed from sage-6.2 to sage-6.3

comment:7 Changed 5 years ago by vbraun_spam

  • Milestone changed from sage-6.3 to sage-6.4
Note: See TracTickets for help on using tickets.