DmitrySemenov
DmitrySemenov

Reputation: 10335

How to colorize negative and positive values on pandas' bar plot?

import numpy as np
import pandas as pd
from pandas import DataFrame, Series
from datetime import datetime
import seaborn as sns
import matplotlib.pyplot as plt
import mpld3

# Set some pandas options
pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', 10)
pd.set_option('display.max_rows', 10)

# seaborn settings
sns.set_palette("deep", desat=.6)
sns.set_context(rc={"figure.figsize": (8,4)})
# And some items for matplotlib
%matplotlib inline 

# plt.style.available
plt.style.use('seaborn')
# mpld3.enable_notebook()
gp = df.groupby(['year','department', 'worktype']).agg({'minutes':'sum'})
df1 = gp.loc[2016]
df2 = gp.loc[2017]
diff = (df2-df1).dropna()
diff['positive']=diff['minutes'] > 0
print(diff)
diff.plot(kind='bar', color=diff.positive.map({True: 'b', False: 'y'}))
plt.show()

My diff dataset

                    minutes  positive
department worktype                   
TA         PHP           0.0     False
           PYTHON     -100.0     False
WEB        ANDROID       5.0      True
           PYTHON     -410.0     False

enter image description here

Upvotes: 1

Views: 2182

Answers (1)

Marcel Flygare
Marcel Flygare

Reputation: 887

You might apply as lambda function to the color argument.

import pandas as pd
%matplotlib inline

df=pd.DataFrame({'department':['TA','TA','WEB','WEB'],
                 'worktype':['PHP','PYTHON','ANDROID','PYTHON'],
                 'minutes':[0.0,-100.0,5.0,-410.0]})\
     .set_index(['department', 'worktype'])
df.plot(kind='bar',
        color=df.minutes.apply(lambda x: 'b' if x>0 else 'y'));

Upvotes: 1

Related Questions