I am trying to establish a legend about a line chart using pandas dataframe values. I searched and could not find a solution, I used another snippet from SO to annotate the bars. The created plot shows stripes from the series in different colors, as I want, and even with the values of the bars. For example, in Excel, you might have a legend that displays series values as a legend. I am trying to get this functionality here.
Here's the MWE:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
import seaborn, itertools
seaborn.set()
def flip(items, ncol):
return itertools.chain(*[items[i::ncol] for i in range(ncol)])
def annotateBars(row, ax=ax):
if row['A'] < 0.2:
color = 'black'
vertalign = 'bottom'
vertpad = 0.02
else:
color = 'white'
vertalign = 'top'
vertpad = -0.02
ax.text(row.name, row['A'] + vertpad, "{:.4f}%".format(row['A']),
zorder=10, rotation=90, color=color,
horizontalalignment='center',
verticalalignment=vertalign,
fontsize=14, weight='heavy')
labels1=["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
width = 0.75
my_colors = 'gbkymc'
arr1 = np.random.random((1, 5))
arr1_ind = np.arange((arr1.shape[1]))
df_arr1 = pd.DataFrame(zip(*arr1), index = arr1_ind, columns = ['A'])
ax = df_arr1.plot(kind='bar', width = 0.85, alpha = 0.5, color = my_colors)
ax.set_xticks(arr1_ind)
ax.set_xticklabels([labels1[i] for i in arr1_ind])
hndls, lbls = ax.get_legend_handles_labels()
plt.legend(flip(hndls, 2), flip(labels1, 2), loc='best', ncol=2)
junk = df_arr1.apply(annotateBars, ax=ax, axis=1)
plt.tick_params(
axis='x',
which='both',
bottom='off',
top='off',
labelbottom='off')
plt.tight_layout()
plt.show()
