Как визуализировать промежуток времени с holoviews? - PullRequest
1 голос
/ 18 октября 2019

Недавно я наткнулся на holoviews как многообещающую библиотеку визуализации в python и - на практике - я хотел перенести часть моего существующего кода, чтобы посмотреть, как он выглядит в hv. Я достиг заданного графика, который не могу воссоздать.

Я хотел бы визуализировать временную шкалу или дорожную карту, где ось x имеет тип pd.datetime, а y - категориальный. Примерно так:

enter image description here

Какой Элемент мне использовать? Как мне определить начало и конец положение для секций?

1 Ответ

1 голос
/ 18 октября 2019

Звучит так, будто вам нужна диаграмма Ганта .
Я использую hv.Curve () рисование линии от начальной точки во временидо конечного момента времени:

# import libraries
from datetime import datetime
import holoviews as hv
hv.extension('bokeh')

# drawing a simple line
line1 = hv.Curve([
    [datetime(2018, 1,  3), 'Event1'],
    [datetime(2018, 1, 31), 'Event1'],
])

# creating a dashed line
line2 = hv.Curve([
    [datetime(2018, 3,  3), 'Event2'],
    [datetime(2018, 3, 30), 'Event2'],
]).opts(line_dash='dashed')

# creating a black thicker line
line3 = hv.Curve([
    [datetime(2018, 7, 15), 'Event2'],
    [datetime(2018, 9, 23), 'Event2'],
]).opts(color='black', line_width=10.0)

# add all 3 lines together on 1 plot with the * symbol
# this creates an overlay
gantt_chart = (line1 * line2 * line3)

# change xlim and width of the whole chart and add xlabel
# just making the plot a bit nicer
gantt_chart.opts(
    width=800, 
    xlim=(datetime(2018, 1, 1), datetime(2018, 12, 31)),
    xlabel='start to stop',
    ylabel='',
)

Как вы можете видеть, я также добавил несколько опций в качестве примера, чтобы изменить стиль линий и изменить диапазон оси X.

Пример кода дает вам этот график: enter image description here

Другое решение - это более общий способ генерации этого графика Ганта,который перебирает данные и генерирует кривую для каждой начальной / конечной точки:

# import libraries
from datetime import datetime
import holoviews as hv
hv.extension('bokeh')

# create sample data
data = [
    [datetime(2018, 1, 3), datetime(2018, 1, 31), 'Event1'],
    [datetime(2018, 3, 3), datetime(2018, 3, 30), 'Event2'],   
    [datetime(2018, 7, 15), datetime(2018, 9, 23), 'Event2'],
]

# loop over data to create a list with a line/curve for every start/stop point
all_lines_list = [
    hv.Curve([
        [row[0], row[2]],
        [row[1], row[2]],
    ]).opts(color='red') for row in data
]

# put all lines in an Overlay plot that can display all lines on 1 plot
gantt_chart = hv.Overlay(all_lines_list)

# make plot nicer
gantt_chart.opts(
    show_legend=False,
    width=800,
    xlim=(datetime(2018, 1, 1), datetime(2018, 12, 31)),
    xlabel='start to stop',
    ylabel='',
)
...