如何在离线模式下(Jupyter笔记本)更新Plotly图表

3

我想在Jupyter Notebook(离线模式)中使用plotly和ipywidgets构建一个简单的界面,我想知道如何更新图表以添加额外的数据。以下是我的代码:

import plotly
from plotly.offline import iplot
from plotly.graph_objs import graph_objs as go
import ipywidgets as widgets
from IPython.display import display

plotly.offline.init_notebook_mode(connected=True)

trace_high = go.Scatter(
                x=[1,2,3,4],
                y=[4,6,2,8],
                name = "High",
                line = dict(color = '#7F7F7F'),
                opacity = 0.8)


data = [trace_high]

def plot_extra_data(drop):
    if drop["new"] == "2":
        trace_low = go.Scatter(
                x=[1,2,3,4],
                y=[1,7,3,5],
                name = "Low",
                line = dict(color = 'green'),
                opacity = 0.8)
        data.append(trace_low)
        fig.update(data=data)

drop = widgets.Dropdown(
    options=['1', '2', '3'],
    value='1',
    description='Number:',
    disabled=False,
)

drop.observe(plot_extra_data, "value")

display(drop)
fig = dict(data=data)
iplot(fig)

任何意见/建议都非常感谢。

在这种情况下,重新绘制图形会更容易。您可以将绘制图形的代码放入一个函数中,并使用 interact 将其链接到您的小部件:http://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html - byouness
@byouness 谢谢您的建议,但是使用interact有一些限制,我正在尝试避免它。 - chemist
@chemist,你能列举一些这些限制吗?这将有助于我决定当前应用程序的最佳选择。 - waterproof
1个回答

2
疯狂的是,似乎每个人都对与离线Plotly图表进行交互感到困惑!
但是,利用属性分配仍然非常简单(例如,请参见此文档,尽管它现在已经部分过时)。
下面是一个天真的代码片段示例,通过dropdown小部件,用户可以交互地更新plotly.graph_objs.FigureWidget()。实际上,包含图表x轴和y轴数据的pandas.DataFrame()沿着用户想要显示线图的Commodity维度进行切片。
最繁琐的部分可能是在使用jupyterlab时设置所有额外的库要求。
import pandas as pd
import plotly.graph_objs as go
import ipywidgets as widgets

df = pd.DataFrame({'cmdty' : ['beans', 'beans', 'beans', 'corn', 'corn', 'corn'],
                'month' : [1, 2, 3, 1, 2, 3],
                'value' : [10.5, 3.5, 8.0, 5.0, 8.75, 5.75]})

items = df.cmdty.unique().tolist()

cmdty = widgets.Dropdown(options=items,
                    description='Commodity')

def response(change):
    c = cmdty.value
    df_tmp = df[df.cmdty == c]
    x0 = df_tmp['month'] # Useless here as x is equal for the 2 commodities
    x1 = df_tmp['value']
    fig.data[0].x = x0 # Useless here as x is equal for the 2 commodities
    fig.data[0].y = x1

fig = go.FigureWidget(data=[{'type' : 'scatter'}])

cmdty.observe(response, names='value')
display(widgets.VBox([cmdty, fig]))

如果您需要将新数据附加到图形上,那么这段代码会是什么样子呢?比如说,您从一个点开始,在每秒钟向图形中添加一个新点。您能否在不重新绘制图形的情况下完成它? - Helena
我已经拥有所有的数据。我只是想以动画方式展示它。我想知道是否有使用batch_animate选项的示例。 - Helena
1
两个关键点:1. 使用FigureWidget代替Figure;2. 使用display而不是iplot来显示图形。 - Cosyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接