moe_95
moe_95

Reputation: 417

Stacked area chart with datetime axis

I am attepmtimng to create a Bokeh stacked area chart from the following Pandas DataFrame.

An example of the of the DataFrame (df) is as follows;

date        tom   jerry   bill
2014-12-07  25    12      25
2014-12-14  15    16      30
2014-12-21  10    23      32
2014-12-28  12    13      55
2015-01-04  5     15      20
2015-01-11  0     15      18
2015-01-18  8     9       17
2015-01-25  11    5       16

The above DataFrame represents a snippet of the total df, which snaps over a number of years and contains additional names to the ones shown.

I am attempting to use the datetime column date as the x-axis, with the count information for each name as the y-axis.

Any assistance that anyone could provide would be greatly appreciated.

Upvotes: 0

Views: 322

Answers (1)

Jasper
Jasper

Reputation: 1795

You can create a stacked area chart by using the patch glyph. I first used df.cumsum to stack the values in the dataframe by row. After that I append two rows to the dataframe with the max and min date and Y value 0. I plot the patches in a reverse order of the column list (excluding the date column) so the person with the highest values is getting plotted first and the persons with lower values are plotted after.

Another implementation of a stacked area chart can be found here.

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.palettes import inferno
from bokeh.models.formatters import DatetimeTickFormatter

df = pd.read_csv('stackData.csv')
df_stack = df[list(df)[1:]].cumsum(axis=1)
df_stack['date'] = df['date'].astype('datetime64[ns]')

bot = {list(df)[0]: max(df_stack['date'])}
for column in list(df)[1:]:
    bot[column] = 0
df_stack = df_stack.append(bot, ignore_index=True)
bot = {list(df)[0]: min(df_stack['date'])}
for column in list(df)[1:]:
    bot[column] = 0
df_stack = df_stack.append(bot, ignore_index=True)

p = figure(x_axis_type='datetime')
p.xaxis.formatter=DatetimeTickFormatter(days=["%d/%m/%Y"])
p.xaxis.major_label_orientation = 45


for person, color in zip(list(df_stack)[2::-1], inferno(len(list(df_stack)))):
    p.patch(x=df_stack['date'], y=df_stack[person], color=color, legend=person)
p.legend.click_policy="hide"
show(p)

enter image description here

Upvotes: 1

Related Questions