#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)