title: Add subplots row header that scales properly in matplotlib
body: <p>How can I use annotate() (or any other command for that matter) to add a second "ylabel" to the right of a figure which makes the text "scale" the same way as the other texts (axis x,y-label and title)? With scaling I mean that I don't want to hack text offsets manually or have a solution which fails as soon as I rescale the figure/add more plots/add a colorbar or similar. I don't want to use twinx, because I'm not plotting any additional data, and I don't need another axis.</p>
  
  <p>Here's an image of what I want to achieve:</p>
  
  <p><a href="https://i.stack.imgur.com/ffkn4.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ffkn4.png" alt="enter image description here"></a></p>
  
  <p>Here is my code to produce this image, I want to change the ax.annotate part:</p>
  
  <pre><code>import numpy as np
  import matplotlib.pyplot as plt
  
  numPlotsY = 3
  numPlotsX = 3
  f, ax_grid = plt.subplots(numPlotsY,numPlotsX,sharex=True,sharey=True)
  
  A = np.arange(numPlotsY)+1.0  # Amplitude
  phi = np.arange(numPlotsX)    # Phase shift
  x = np.linspace(0,2.0,100)    # x
  
  for y_i in range(0,numPlotsY):
      for x_i in range(0,numPlotsX):
          ax = ax_grid[y_i,x_i]
  
          y = A[y_i]*np.sin(x*np.pi + phi[x_i])
  
          ax.plot(x,y,lw=2.0)
  
          # Add xlabel to the left column
          if x_i == 0:
              ax.set_ylabel(r'$y$')
              ax.set_yticks([-4,-2,0,2,4])
  
          # Add ylabel below bottom row
          if y_i == numPlotsY-1:
              ax.set_xlabel(r'$x/\pi$')
              ax.set_xticks([0.5,1.0,1.5])
  
          # Add Phi label above top row
          if y_i == 0:
              ax.set_title(r'$\phi=%s$' % phi[x_i])
  
          # Add amplitude label to the right... how??
          if x_i == numPlotsX-1:
              ax.annotate(r'$A=%d$' % A[x_i], xy=(1.1,0.5), rotation=90,
                          ha='center',va='center',xycoords='axes fraction')
  
  f.subplots_adjust(wspace=0,hspace=0)
  plt.suptitle(r'$A\cdot\sin\left(2\pi x + \phi\right)$',fontsize=18)
  plt.show()
  </code></pre>
  
  <p>I've seen this topic discussed several times without an elegant solution. There's always so much hacking involved. I really think this boils down to the way matplotlib treats the axes. Why can't there be one label for each of the four sides of the figure, that behave the same way?</p>