В вашем случае вы могли бы упростить свой код, объединив все свои данные в один DataFrame
(я полагаю, что в настоящее время они индивидуальны Series
):
создание фиктивных данных
my_names = ['timeline','links','status','posts','shared']
my_series = [pd.Series(data=np.random.random(size=(9,)), index=range(2010,2019), name=n) for n in my_names]
преобразовать список Series в DataFrame:
df = pd.DataFrame(my_series).T
display(df)
timeline links status posts shared
2010 0.534663 0.107604 0.265774 0.849307 0.149886
2011 0.064561 0.354329 0.557265 0.297695 0.563122
2012 0.646828 0.011643 0.608695 0.493709 0.337949
2013 0.170792 0.083039 0.866962 0.278223 0.501074
2014 0.386262 0.979529 0.972009 0.333049 0.505644
2015 0.764539 0.223265 0.365314 0.712091 0.757626
2016 0.012084 0.700645 0.118666 0.118811 0.332993
2017 0.407492 0.480495 0.399464 0.613331 0.655171
2018 0.072698 0.262846 0.763811 0.783575 0.859755
Простой способ, используя команду pandas plot
:
df.plot(kind='bar', stacked=True, width=0.85)

или прямое использование matplotlib для большей гибкости:
fig, ax = plt.subplots()
for i,col in enumerate(df.columns):
ax.bar(df.index, height=df[col], bottom=df.iloc[:,:i].sum(axis=1), edgecolor="white", width=0.85)
ax.set_xticks(df.index)
