使用python以图形方式离线更新图表

ele*_*nor 10 python plotly

我在Jupyter上使用plotly offline.我正在绘制曲线:

from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
from plotly.graph_objs import *
import datetime as dt

list_date = [dt.datetime(2016,1,1).date(), dt.datetime(2016,1,2).date(), dt.datetime(2016,1,3).date(), dt.datetime(2016,1,4).date()]
data = []
for i in range(3) : 
    list = [i/2+1, i/2+2, i/2+3, i/2+4]
    data.append(Scatter(x=list_date, y=list, name='y'+str(i)))
figure = Figure(data=data)
iplot(figure)
Run Code Online (Sandbox Code Playgroud)

而且我得到了一个非常好的图表!后者用户想要在其上添加条形图(除了已存在的2条线).

list_bar = [0.5, 1.5, 2.5, 3.5]
data = [Bar(x=list_date, y=list_bar, name='bar')]
figure.update(data=data)
iplot(figure)
Run Code Online (Sandbox Code Playgroud)

但我只有条形图,而不是前两行.如何离线相当于在线功能fileopt ='append'?

py.plot(data, filename='append plot', fileopt='append') 
Run Code Online (Sandbox Code Playgroud)

谢谢 !

Tyl*_*ler 2

在最新的plotly版本3中,专门添加了一个FigureWidget来解决您想要更新现有离线图形的问题。

对我来说,运行pip install plotly --upgrade让我在 Anaconda 环境中获得了最新版本。

我已经修改了下面的示例代码以使用新的FigureWidget,并保留了需要通过注释进行更改的旧代码。新的FigureWidget 旨在与您正在使用的普通Figure兼容。

from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
from plotly.graph_objs import *

import datetime as dt

# list_date = [dt.datetime(2016,1,1).date(), dt.datetime(2016,1,2).date(), dt.datetime(2016,1,3).date(), dt.datetime(2016,1,4).date()]
list_date = [dt.datetime(2016,1,1), dt.datetime(2016,1,2), dt.datetime(2016,1,3), dt.datetime(2016,1,4)]

data = []
for i in range(3) :
    list = [i/2+1, i/2+2, i/2+3, i/2+4]
    data.append(Scatter(x=list_date, y=list, name='y'+str(i)))
# figure = Figure(data=data)
# iplot(figure)
figure = FigureWidget(data=data)
figure
Run Code Online (Sandbox Code Playgroud)

我已经注释掉了更改的部分,以便您可以查看它们以供参考。

上面代码中的第一个图

另一件需要注意的事情是,由于 ipykernel.json_util 中的问题,序列化 Plotly JSON 对象以在 Jupyter 屏幕上显示的 json_clean 函数不知道如何处理 datetime.date 对象——只知道 datetime 对象。如果您不删除 .date,您将收到异常并且没有图表。我猜测 datetime.time 对象也会发生这种情况,因为它似乎在当前的ipykernel 代码中也未处理。

当您准备好运行更新的代码时,您只需创建数据并使用该add_trace函数:

list_bar = [0.5, 1.5, 2.5, 3.5]
figure.add_trace(Bar(x=list_date, y=list_bar, name='bar'))
Run Code Online (Sandbox Code Playgroud)

并且您的绘图会自动更新前一个单元格中添加的迹线。

相同的情节,但现在用跟踪更新

最后,对于那些感兴趣的人来说,有一个关于新的FigureWidget 的很好的指南。