Как обновить сюжетный график в автономном режиме (блокнот Jupyter) - PullRequest
0 голосов
/ 17 мая 2018

Я хотел бы создать простой интерфейс с графикой и ipywidgets внутри Jupyter Notebook (автономный режим), и мне интересно, как обновить график, если я хочу добавить дополнительные данные. Вот мой код:

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)

Любые комментарии / предложения высоко ценятся.

1 Ответ

0 голосов
/ 28 июля 2018

Сумасшедший, как все, кажется, смущены взаимодействием с оффлайн графиками!

Тем не менее, довольно просто воспользоваться преимуществом присвоения свойств (например, см. Эту документацию , хотя в настоящее время она частично устарела).

Приведенный ниже наивный фрагмент кода обновляет plotly.graph_objs.FigureWidget() при взаимодействии пользователя через виджет dropdown. Фактически, 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]))
...