具有日期时间轴的堆积面积图

时间:2019-03-13 17:07:23

标签: python bokeh

我正准备从以下Pandas DataFrame中创建散景堆叠区域图。

DataFrame(df)的示例如下;

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

上面的DataFrame代表总df的代码段,该代码段持续了数年,并且包含所示名称的其他名称。

我试图将日期时间列date用作x轴,并将每个名称的计数信息用作y轴。

任何人都可以提供的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用补丁字形创建堆积面积图。我首先使用df.cumsum逐行堆叠数据帧中的值。之后,我向数据框添加两行,最大日期和最小日期且Y值为0。我以与列列表相反的顺序绘制补丁(不包括日期列),因此具有最高值的人将首先被绘制,值较低的人被画出来。

堆积面积图的另一种实现方式可以在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