code: def stereonet_projection_explanation(ax):
      
      ax.set_title('Dip and Azimuth', y=1.1, size=18)
  
      # Set the azimuth ticks to be just "N", "E", etc.
      ax.set_azimuth_ticks(range(0, 360, 10))
  
      # Hackishly set some of the azimuth labels to North, East, etc...
      fmt = ax.yaxis.get_major_formatter()
      labels = [fmt(item) for item in ax.get_azimuth_ticks()]
      labels[0] = 'North'
      labels[9] = 'East'
      labels[18] = 'South'
      labels[27] = 'West'
      ax.set_azimuth_ticklabels(labels)
  
      # Unhide the xticklabels and use them for dip labels
      ax.xaxis.set_tick_params(label1On=True)
      labels = list(range(10, 100, 10)) + list(range(80, 0, -10))
      ax.set_xticks(np.radians(np.arange(-80, 90, 10)))
      ax.set_xticklabels([fmt(np.radians(item)) for item in labels])
  
      ax.set_xlabel('Dip or Plunge')
  
      xlabel_halo(ax)
      return ax
docs: Example to explain azimuth and dip on a lower-hemisphere stereonet.