
# https://www.globalsino.com/ICs/
# Horizontal stacked bar of percentage of total

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# data
labels = ['A', 'B', 'C', 'D', 'E']    
TeamAOriginal = [1, 45, 28, 11, 4]
TeamBOriginal = [3, 58, 17, 8, 3]
TeamCOriginal = [1, 44, 30, 11, 3]

ColumnA = TeamAOriginal[0]+TeamBOriginal[0]+TeamCOriginal[0]
ColumnB = TeamAOriginal[1]+TeamBOriginal[1]+TeamCOriginal[1]
ColumnC = TeamAOriginal[2]+TeamBOriginal[2]+TeamCOriginal[2]
ColumnD = TeamAOriginal[3]+TeamBOriginal[3]+TeamCOriginal[3]
ColumnE = TeamAOriginal[4]+TeamBOriginal[4]+TeamCOriginal[4]
total = ColumnA + ColumnB + ColumnC + ColumnD + ColumnE
print(total)

PercentA0 = 100*TeamAOriginal[0]/total
PercentA1 = 100*TeamAOriginal[1]/total
PercentA2 = 100*TeamAOriginal[2]/total
PercentA3 = 100*TeamAOriginal[3]/total
PercentA4 = 100*TeamAOriginal[4]/total

PercentB0 = 100*TeamBOriginal[0]/total
PercentB1 = 100*TeamBOriginal[1]/total
PercentB2 = 100*TeamBOriginal[2]/total
PercentB3 = 100*TeamBOriginal[3]/total
PercentB4 = 100*TeamBOriginal[4]/total

PercentC0 = 100*TeamCOriginal[0]/total
PercentC1 = 100*TeamCOriginal[1]/total
PercentC2 = 100*TeamCOriginal[2]/total
PercentC3 = 100*TeamCOriginal[3]/total
PercentC4 = 100*TeamCOriginal[4]/total

TeamA = [PercentA0, PercentA1, PercentA2, PercentA3, PercentA4]
TeamB = [PercentB0, PercentB1, PercentB2, PercentB3, PercentB4]
TeamC = [PercentC0, PercentC1, PercentC2, PercentC3, PercentC4]

# create a dict with the keys as the desired legend labels
data = {'labels': labels, 'TeamA': TeamA, 'TeamB': TeamB, 'TeamC': TeamC}
# create dataframe
df = pd.DataFrame(data)
ax = df.plot(kind='barh', x='labels', width=0.9, figsize=(12, 10), xlabel='',
             color=['#b02a2a', '#055cad', '#0b7d53'], stacked=True)
ax.set_xlabel('Percentage (%)', fontsize=15)
ax.set_xlim(0, 60)

ax.legend(loc='upper right', frameon=False, fontsize=15, markerscale=2)

for c in ax.containers:
    labels = [f'{w:.0f}' if (w := v.get_width()) > 1 else '' for v in c]
    ax.bar_label(c, labels=labels, label_type='center', padding=1, size=15)
    
ax.tick_params(axis='both', which='both', labelsize=15)
ax.spines[['top', 'right']].set_visible(False)

plt.show()
