python 使用新数据更新绘图,而不是在Jupiter笔记本中绘制新绘图

jgwigjjp  于 2023-02-07  发布在  Python
关注(0)|答案(1)|浏览(135)

我有一些问题,我希望你能帮我解决它。我需要创建一个下拉小部件,我可以选择和绘制感兴趣的数据交互式绘图。我这样做的方式如下:

import plotly.graph_objects as go
import ipywidgets as widgets

import pandas as pd

df = pd.DataFrame(
    {'ticker' : ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 'timestamp' : [1,1,1,2,2,2,3,3,3], 'val' : [10,11,12,21,22,23, 100, 200, 300]})

ddwn = widgets.Dropdown(options = df.ticker.unique())
display(ddwn)

def on_change(change):
    if change['type'] == 'change' and change['name'] == 'value':
            d = df[df['ticker'] == change['new']].sort_values('timestamp')
            fig = go.Figure(data=go.Scatter(x=list(d.timestamp), y=list(d.val), name=change['new']))
            fig.show()

ddwn.observe(on_change)

问题是一个新的图形被添加到前一个图形的下面,而不是清除当前图形。但我真的想更新图形。我试图使用Clear MatPlotLib figure in Jupyter Python notebook中的答案,但它没有帮助我。
另外,我有很多股票代码,因此我不想在每一个股票代码上都创建一个字符并使用它。

kqqjbcuj

kqqjbcuj1#

选项1:

此选项保留在Plotly:

# based on https://stackoverflow.com/a/73918907/8508004 and https://stackoverflow.com/q/75365695/8508004
import plotly.graph_objects as go
import pandas as pd
from ipywidgets import widgets
from ipywidgets import interact

df = pd.DataFrame(
    {'ticker' : ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 'timestamp' : [1,1,1,2,2,2,3,3,3], 'val' : [10,11,12,21,22,23, 100, 200, 300]})

tickers = df.ticker.tolist()

@interact
def read_values(
    selected_ticker=widgets.Dropdown(
        description="Select :", value="a", options=tickers[:3]
    )
):

    df_sub = df[df.ticker == selected_ticker]
    fig = go.Figure(data=go.Scatter(x = df_sub.timestamp, y = df_sub.val))
    go.FigureWidget(fig.to_dict()).show()

(Note我发现通常使用Plotly Graph对象时,我必须从下拉列表中选择一些东西,然后它才能显示图形。在我选中第一个字母之前,它只显示空白。使用JupyterLab,它立即工作。没有空白;它立即开始显示a图。)

选项2:

基于Matplotlib的选项:

#based on https://stackoverflow.com/a/74551129/8508004 and references therein, combined with https://stackoverflow.com/q/75365695/8508004
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython import display 
import pandas as pd

df = pd.DataFrame(
    {'ticker' : ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'], 'timestamp' : [1,1,1,2,2,2,3,3,3], 'val' : [10,11,12,21,22,23, 100, 200, 300]})

tickers = df.ticker.tolist()

def display_selected_plot(x):
    df_sub = df[df.ticker == x]
    fig=plt.figure()
    plt.plot(df_sub.timestamp,  df_sub.val, '-o')
    plt.grid(True) #optional grid
    plt.show()
    
selected_ticker=widgets.Dropdown(
        description="Select :", value="a", options=tickers[:3]
    )

gui = widgets.interactive(display_selected_plot, x=selected_ticker) #Create our interactive graphic with the dropdown as the argument
gui

在我的尝试中,您引用的Matplotlib示例代码并不像它对我说的那样工作。我使用了ipywidget的interactive,我最近看到它工作得很好,而不需要%matplotlib notebook,它在JupyterLab中不工作。

    • 在系统上不安装任何组件的情况下尝试以下操作:**

转到here并按下"启动活页夹"。一个临时的远程会话将通过MyBinder启动。要尝试Plotly,请从可用笔记本列表中选择"通过Plotly进行3D散点图"。当它打开时,使用"运行全部"来运行所有的例子。然后在底部创建一个新的单元格并粘贴到Plotly的例子中。(我不明白为什么Plotly示例在经典的Jupyter笔记本界面中显得古怪,以及/或者如果不首先在经典的Jupyter笔记本界面中运行其他代码,就不能导入什么?)
如果将Matplotlib示例粘贴到出现并运行代码的第一个笔记本中,它将工作。
要切换到JupyterLab,点击左上方的Jupyter图标,然后在弹出的会话中打开一个新的笔记本,粘贴其中的代码块并运行它。
由于会话是临时的,如果您创建了任何有用的内容,请确保将其下载到本地计算机。

相关问题