在 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)
我有几个数据集,我想绘制日期作为 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)
我得到的结果是这样的:
为了绘制小时数,您需要做两件事:
- 将 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)