Я пытаюсь использовать глиф Bokeh Quad для создания диаграммы Ганта, и по какой-то причине столбцы добавляются в обратном хронологическом порядке.
Вот изображение результата боке, которое Я получаю.
Я использую pandas фрейм данных для создания объекта ColumnDataSource, и независимо от того, как я сортирую или переиндексирую фрейм данных, он, похоже, не влияет на макет Quad . Я бы хотел, чтобы столбцы отображались для действий, отсортированных по дате начала и по возрастанию, как в обычной диаграмме Ганта.
Существует ли известный способ реорганизации полос в квадрате на основе исходного столбца?
Для справки, вот код, который я использую для создания изображения, указанного выше:
from bokeh.plotting import figure, show, output_file
from bokeh.models import ColumnDataSource, Range1d
from bokeh.models.tools import HoverTool
from datetime import datetime
import pandas as pd
output_file('gantt_chart.html')
data_dict = {'activityRef': ['c.001.50', 'c.002.51', 'c.073.51', 'c.074.51', 'c.003.52', 'c.004.53', 'c.079.53', 'c.080.53', 'c.005.54', 'c.084.54', 'c.006.60', 'c.088.61', 'c.091.61', 'c.092.61', 'c.007.61', 'c.093.61', 'c.094.61', 'c.095.61', 'c.096.62', 'm.003.62', 'c.008.62'], 'activityPrefix': ['Demolition', 'Grading', 'Structural Excavation, Backfill', 'MechElec Excavation, Backfill', 'Utilities', 'Civil Paving', 'Aggregates', 'Material Processing, Plants', 'Temporary Work', 'Scaffolding', 'Deep Foundation', 'Concrete Paving', 'Concrete Foundations', 'MechElec Concrete', 'Precast Concrete', 'Concrete Thermal Control', 'Rebar Placement', 'Anchor Bolts, Embedments', 'Structural Welding', 'Module Assembly', 'Erect Steel'], 'disciplineRef': ['Civil', 'Civil', 'Civil', 'Civil', 'Civil', 'Civil', 'Civil', 'Civil', 'Temporary Work', 'Temporary Work', 'Civil', 'Concrete', 'Concrete', 'Concrete', 'Concrete', 'Concrete', 'Concrete', 'Concrete', 'Structural', 'Structural', 'Structural'], 'duration': [10, 12, 18, 40, 25, 15, 10, 12, 18, 40, 25, 15, 10, 12, 18, 40, 25, 15, 10, 12, 18]}
df = pd.DataFrame(data_dict)
df['start'] = '6/16/2020'
df['start'] = pd.to_datetime(df['start'])
df['start'] = [d + pd.Timedelta(days=i) for i, d in enumerate(df.start)]
df['end'] = df.apply(lambda row: row.start + pd.Timedelta(days=row.duration), axis=1)
df['color'] = 'blue'
df['activity'] = df.activityPrefix + ' - ' + df.activityRef
df['bottom'] = df.index+0.8
df['top'] = df.index+1.2
fig=figure(
title='Project Schedule',
x_axis_type='datetime',
x_axis_location="above",
width=1900,
height=(df.shape[0] * 12),
y_range=df.activity.tolist(),
x_range=Range1d(df.start.min(), df.end.max()),
)
hover=HoverTool(tooltips="Task: @activity<br>\
Start: @start<br>\
End: @end")
fig.add_tools(hover)
cds=ColumnDataSource(df)
fig.quad(left='end', right='start', bottom='bottom', top='top', source=cds, color="color")
show(fig)
Заранее спасибо!