title: How to add custom annotations, from the dataframe, to a stacked bar chart?
body: <p>I'm plotting a cross-tabulation of various offices within certain categories. I'd like to put together a horizontal stacked bar chart where each office and its value is labeled. </p>
  
  <p>Here's some example code:</p>
  
  <pre class="lang-py prettyprint-override"><code>import pandas as pd
  import numpy as np
  import matplotlib.pyplot as plt
  
  # create dataframe
  df = pd.DataFrame({'office1': [1, np.nan, np.nan],
                     'office2': [np.nan, 8, np.nan],
                     'office3': [12, np.nan, np.nan],
                     'office4': [np.nan, np.nan, 3],
                     'office5': [np.nan, 5, np.nan],
                     'office6': [np.nan, np.nan, 7],
                     'office7': [3, np.nan, np.nan],
                     'office8': [np.nan, np.nan, 11],
                     'office9': [np.nan, 6, np.nan]},
                    index=['catA', 'catB', 'catC'])
  
  # plot dataframe
  ax = df.plot.barh(title="Office Breakdown by Category",
                    legend=False,
                    figsize=(10,7), stacked=True)
  </code></pre>
  
  <p>This gives me a fine starting point: </p>
  
  <p><a href="https://i.stack.imgur.com/d4Jeu.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/d4Jeu.png" alt="Stacked Bar Chart Example"></a></p>
  
  <p>However, what I'd like to have is this: 
  <a href="https://i.stack.imgur.com/a3FwK.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/a3FwK.png" alt="Bar Chart with labels"></a></p>
  
  <p>After some research, I came up with the following code that correctly lines up labels on the 'category' axis: </p>
  
  <pre><code>def annotateBars(row, ax=ax):
      for col in row.index:
          value = row[col]
          if (str(value) != 'nan'):
              ax.text(value/2, labeltonum(row.name), col+","+str(value))
  
  def labeltonum(label):
      if label == 'catA':
          return 0
      elif label == 'catB':
          return 1
      elif label == 'catC':
          return 2
  
  df.apply(annotateBars, ax=ax, axis=1)
  </code></pre>
  
  <p>But this doesn't factor in the "stacking" of the bars. I've also tried iterating through the <code>patches</code> container returned by the plot command (which can let me retrieve x &amp; y positions of each rectangle), but I then lose any connection to the office labels. </p>