Showing posts with label Python H Barchart. Show all posts
Showing posts with label Python H Barchart. Show all posts

Sunday, July 30, 2017

Python Matplotlib and Horizontal Barchart (hbar)


Download the sample data here... import numpy as np import pandas as pd import matplotlib.pyplot as plt import random df = pd.read_csv(r'F:\Python\...\shampoo_sales.txt', sep='\t', header=0) df['Month'] = pd.to_datetime(df['Month']) color=[] r = lambda: random.randint(0,255) color.append('#%02X%02X%02X' % (r(),r(),r())) y_pos = [i for i in range(len(df))] y_label = [str(i)[0:7] for i in df['Month'].tolist()] def autolabel_stack(rects, left=0, fontsize=10): """ Attach a text label above each bar displaying its height """ i=0 for rect in rects: length = rect.get_width() ax.text(left[i]+length/2, rect.get_y(), '%d' % int(length), horizontalalignment ='center', verticalalignment ='top', fontsize=fontsize, rotation=0, color='white') i+=1 width = 0.85 color=[] for i in range(len(df)): r = lambda: random.randint(0,255) color.append('#%02X%02X%02X' % (r(),r(),r())) fig, ax = plt.subplots(figsize=(10,7), dpi=100) #ax.set_xlim([0, 815]) ax.spines['right'].set_visible(False) #ax.spines['left'].set_visible(False) ax.spines['top'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.xaxis.grid(b=False, which='major', color='gray', linestyle='--') #ax.yaxis.grid(b=False, which='major', color='gray', linestyle='--') lefts_01 = [0]*len(y_pos) hbar1 = ax.barh(y_pos, df['Shampoo_Sales'], width, align='center', color='#5291A2', ecolor='black', label='Shampoo', left=lefts_01) lefts_02 = lefts_01 + df['Shampoo_Sales'] hbar2 = ax.barh(y_pos, df['Other_Sales'], width, align='center', color='#8F26EC', ecolor='black', label='Other', left=lefts_02) ax.set_yticks(y_pos) ax.set_yticklabels(y_label) ax.invert_yaxis() # labels read top-to-bottom ax.set_xlabel('Shampoo Sales') ax.set_title('Shampoo Sales time vs. Sales') ax.twinx() ax.legend() autolabel_stack(rects=hbar1, left=lefts_01, fontsize=8.5) autolabel_stack(rects=hbar2, left=lefts_02, fontsize=8.5) plt.show()