Andrea Fox
Andrea Fox

Reputation: 53

Stacked Area Chart in Python

I'm working on an assignment from school, and have run into a snag when it comes to my stacked area chart.

The data is fairly simple: 4 columns that look similar to this:

Series id Year Period Value
LNS140000 1948 M01 3.4

I'm trying to create a stacked area chart using Year as my x and Value as my y and breaking it up over Period.

#Stacked area chart still using unemployment data
x = d.Year
y = d.Value


plt.stackplot(x, y, labels = d['Period'])
plt.legend(d['Period'], loc = 'upper left')
plt.show()enter code here`

However, when I do it like this it only picks up M01 and there are M01-M12. Any thoughts on how I can make this work?

Upvotes: 4

Views: 8870

Answers (3)

Andrea Fox
Andrea Fox

Reputation: 53

So I was able to use Seaborn to help out. First I did a pivot table

df = d.pivot(index = 'Year',
       columns = 'Period',
       values = 'Value')
df

Then I set up seaborn

plt.style.use('seaborn')
sns.set_style("white")
sns.set_theme(style = "ticks")

df.plot.area(figsize = (20,9))
plt.title("Unemployment by Year and Month\n", fontsize = 22, loc = 'left')
plt.ylabel("Values", fontsize = 22)
plt.xlabel("Year", fontsize = 22)

enter image description here

Upvotes: 1

Fabio Mendes Soares
Fabio Mendes Soares

Reputation: 1405

You need to preprocess your data a little before passing them to the stackplot function. I took a look at this link to work on an example that could be suitable for your case. Since I've seen one row of your data, I add some random values to the dataset.

import pandas as pd
import matplotlib.pyplot as plt
dd=[[1948,'M01',3.4],[1948,'M02',2.5],[1948,'M03',1.6],
    [1949,'M01',4.3],[1949,'M02',6.7],[1949,'M03',7.8]]
d=pd.DataFrame(dd,columns=['Year','Period','Value'])
years=d.Year.unique()
periods=d.Period.unique()

#Now group them per period, but in year sequence
d.sort_values(by='Year',inplace=True) # to ensure entire dataset is ordered
pds=[]
for p in periods:
    pds.append(d[d.Period==p]['Value'].values)

plt.stackplot(years,pds,labels=periods)
plt.legend(loc='upper left')
plt.show()

Stack Area Plot

Is that what you want?

Upvotes: 1

Orozco
Orozco

Reputation: 385

It seems to me that the problem you are having relates to the formatting of the data. Look how the values are formatted in this matplotlib example. I would try to groupby the data by period, or pivot it in the correct format, and then graphing again.

Upvotes: 0

Related Questions