Диаграмма областей с накоплением по оси datetime

#python #bokeh

#python #боке

Вопрос:

Я пытаюсь создать диаграмму областей с наслоением в виде боке из следующего фрейма данных Pandas.

Пример фрейма данных (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
  

Приведенный выше фрейм данных представляет фрагмент общего df, который привязан к ряду лет и содержит дополнительные имена к показанным.

Я пытаюсь использовать столбец datetime date в качестве оси x, с информацией о количестве для каждого имени в качестве оси y.

Мы были бы очень признательны за любую помощь, которую кто-либо может оказать.

Ответ №1:

Диаграмму областей с накоплением можно создать с помощью глифа patch. Сначала я использовал df.cumsum для суммирования значений в фрейме данных по строкам. После этого я добавляю две строки к фрейму данных с максимальной и минимальной датой и значением Y 0. Я наношу исправления в порядке, обратном порядку списка столбцов (исключая столбец даты), поэтому сначала отображается человек с наибольшими значениями, а люди с меньшими значениями отображаются после.

Другую реализацию диаграммы областей с накоплением можно найти здесь.

 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)
  

введите описание изображения здесь