在 plotly 上绘制日期和时间

Graphing date vs time on plotly

我有几个数据集,我想绘制日期作为 X 轴,时间作为 Y 轴。我在 Jupyter Notebook 中工作。

from datetime import date, time
from plotly import offline as py
from plotly.graph_objs import Scatter, Data
py.init_notebook_mode(connected=True)

meetings = Scatter(
    x=[date(2017, 1, 1), date(2017, 1, 3), date(2017, 1, 3)],
    y=[time(8, 0, 0), time(12, 0, 0), time(16, 0, 0)],
    text=['work meeting 1', 'work meeting 1', 'work meeting 1'],
    mode='markers'
)

workouts = Scatter(
    x=[date(2017, 1, 1), date(2017, 1, 2), date(2017, 1, 2)],
    y=[time(7, 30, 0), time(14, 30, 0), time(17, 0, 0)],
    text=['workout 1', 'workout 2', 'workout 3'],
    mode='markers'
)

data = Data([meetings, workouts])
py.iplot(data)

我得到的结果是这样的: X 轴也包括时间,Y 轴按插入数据的顺序排列,而不是从下到上。我尝试修改 range/domain 都没有解决这个问题。 从我在 help page 上看到的情况来看,不支持时间对象。 有什么办法可以让这种情节发挥作用吗?

为了绘制小时数,您需要做两件事:

  • 将 yaxis type 设置为日期,将 tickformat 设置为 %H:%M
  • 将您的 time 个对象转换为 datetime 个对象

我们假设 yaxis 上的所有事情都发生在同一天,但我们只报告时间。

import plotly
import datetime as dt

meetings = plotly.graph_objs.Scatter(
    x=[dt.date(2017, 1, 1), dt.date(2017, 1, 3), dt.date(2017, 1, 3)],
    y=[dt.time(8, 0, 0), dt.time(12, 0, 0), dt.time(16, 0, 0)],
    text=['work meeting 1', 'work meeting 1', 'work meeting 1'],
    mode='markers'
)

workouts = plotly.graph_objs.Scatter(
    x=[dt.date(2017, 1, 1), dt.date(2017, 1, 2), dt.date(2017, 1, 2)],
    y=[dt.time(7, 30, 0), dt.time(14, 30, 0), dt.time(17, 0, 0)],
    text=['workout 1', 'workout 2', 'workout 3'],
    mode='markers'
)

for d in [meetings, workouts]:
    for i, t in enumerate(d.y):
        d.y[i] = dt.datetime.combine(dt.date(2017, 1, 1), t)

layout = plotly.graph_objs.Layout(yaxis={
    'type': 'date',
    'tickformat': '%H:%M'
    }
)

fig = plotly.graph_objs.Figure(
    data=plotly.graph_objs.Data([meetings, workouts]),
    layout=layout
)
plotly.offline.plot(fig)