I am trying to plot a groupby-pandas-dataframe in which I have a categorical variable by which I would like to order the bars.
A sample code of what I am doing:
import pandas as pd
df = {"month":["Jan", "Jan", "Jan","Feb", "Feb", "Mar"],
"cat":["High", "High", "Low", "Medium", "Low", "High"]}
df = pd.DataFrame(df)
df.groupby("month")["cat"].value_counts().unstack(0).plot.bar()
Which plots:
However, I would like to plot within each category the order to be Jan, Feb, March.
Any help on how to achieve this would be a appreciated.
Kind regards.
I recommend you to use the seaborn
package for plotting data from dataframes. It's very simple to organize and order each element when plotting.
First let's add a column with the counts of each existing month/cat combination:
import pandas as pd
data = {"month":["Jan", "Jan", "Jan","Feb", "Feb", "Mar"],
"cat":["High", "High", "Low", "Medium", "Low", "High"]}
df = pd.DataFrame(data)
df = df.value_counts().reset_index().rename(columns={0: 'count'})
print(df)
# output:
#
# month cat count
# 0 Jan High 2
# 1 Mar High 1
# 2 Jan Low 1
# 3 Feb Medium 1
# 4 Feb Low 1
Plotting with seaborn
then becomes as simple as:
import matplotlib.pyplot as plt
import seaborn as sns
sns.barplot(
data=df,
x='cat',
y='count',
hue='month',
order=['Low', 'Medium', 'High'], # Order of elements in the X-axis
hue_order=['Jan', 'Feb', 'Mar'], # Order of colored bars at each X position
)
plt.show()
Output image: