bernando_vialli
bernando_vialli

Reputation: 1019

Adjusting the color coding on a barplot so that all values are color coded correctly in matplotlib

I have a barplot that plots Rates by State and by Category (there are 5 categories) but the problem is that some States have more categories than other states.

import pandas as pd
import matplotlib.pyplot as plt


df = pd.DataFrame({"state" : ["AL","AL","AL","AK", ],
                   "status" : ["Booked", "Rejected","Cancelled","Rejected"],
                   "0" : [1.5,2.5,3.5,1.0]})

df2 = df.groupby(['state','status']).size()/df.groupby(['state']).size()

fig, ax = plt.subplots()
plt.xlabel('State')
plt.ylabel('Bookings')

my_colors = 'gyr'
df2.plot(kind='bar', color=my_colors, orientation='vertical')

plt.tight_layout()
plt.show()

This does a good job with most of what I need to do however, what happens is that because some States do not have all values for status and hence do not appear in the plot, it makes some of the color coding incorrect because the colors are just shifted to repeat every 5 colors rather then based on whenever a value is missing or not. What can I do about this?

Upvotes: 2

Views: 52

Answers (1)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339795

Possibly you want to show the data in a grouped fashion, namely to have 3 categories per group, such that each category has its own color.

In this case it seems this can easily be achieved by unstacking the multi-index dataframe,

df2.unstack().plot(...)

Complete example:

import pandas as pd
import matplotlib.pyplot as plt


df = pd.DataFrame({"state" : ["AL","AL","AL","AK", ],
                   "status" : ["Booked", "Rejected","Cancelled","Rejected"],
                   "0" : [1.5,2.5,3.5,1.0]})

df2 = df.groupby(['state','status']).size()/df.groupby(['state']).size()

fig, ax = plt.subplots()
plt.xlabel('State')
plt.ylabel('Bookings')

my_colors = 'gyr'
df2.unstack().plot(kind='bar', color=my_colors, orientation='vertical', ax=ax)

plt.tight_layout()
plt.show()

enter image description here

Upvotes: 2

Related Questions