如何进行交互更新?

问题描述 投票:0回答:1

有关下拉菜单的 Plotly 文档包含以下示例:

import plotly.graph_objects as go

import pandas as pd

# Load dataset
df = pd.read_csv(
    "https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv")
df.columns = [col.replace("AAPL.", "") for col in df.columns]

# Initialize figure
fig = go.Figure()

# Add Traces

fig.add_trace(
    go.Scatter(x=list(df.Date),
               y=list(df.High),
               name="High",
               line=dict(color="#33CFA5")))

fig.add_trace(
    go.Scatter(x=list(df.Date),
               y=[df.High.mean()] * len(df.index),
               name="High Average",
               visible=False,
               line=dict(color="#33CFA5", dash="dash")))

fig.add_trace(
    go.Scatter(x=list(df.Date),
               y=list(df.Low),
               name="Low",
               line=dict(color="#F06A6A")))

fig.add_trace(
    go.Scatter(x=list(df.Date),
               y=[df.Low.mean()] * len(df.index),
               name="Low Average",
               visible=False,
               line=dict(color="#F06A6A", dash="dash")))

# Add Annotations and Buttons
high_annotations = [dict(x="2016-03-01",
                         y=df.High.mean(),
                         xref="x", yref="y",
                         text="High Average:<br> %.3f" % df.High.mean(),
                         ax=0, ay=-40),
                    dict(x=df.Date[df.High.idxmax()],
                         y=df.High.max(),
                         xref="x", yref="y",
                         text="High Max:<br> %.3f" % df.High.max(),
                         ax=-40, ay=-40)]
low_annotations = [dict(x="2015-05-01",
                        y=df.Low.mean(),
                        xref="x", yref="y",
                        text="Low Average:<br> %.3f" % df.Low.mean(),
                        ax=0, ay=40),
                   dict(x=df.Date[df.High.idxmin()],
                        y=df.Low.min(),
                        xref="x", yref="y",
                        text="Low Min:<br> %.3f" % df.Low.min(),
                        ax=0, ay=40)]

fig.update_layout(
    updatemenus=[
        dict(
            active=0,
            buttons=list([
                dict(label="None",
                     method="update",
                     args=[{"visible": [True, False, True, False]},
                           {"title": "Yahoo",
                            "annotations": []}]),
                dict(label="High",
                     method="update",
                     args=[{"visible": [True, True, False, False]},
                           {"title": "Yahoo High",
                            "annotations": high_annotations}]),
                dict(label="Low",
                     method="update",
                     args=[{"visible": [False, False, True, True]},
                           {"title": "Yahoo Low",
                            "annotations": low_annotations}]),
                dict(label="Both",
                     method="update",
                     args=[{"visible": [True, True, True, True]},
                           {"title": "Yahoo",
                            "annotations": high_annotations + low_annotations}]),
            ]),
        )
    ])

# Set title
fig.update_layout(title_text="Yahoo")

fig.show()

我想要两个下拉菜单,一个用于“高可见”,另一个用于“低可见”,标题应为“雅虎,高:{是或否},低:{是或否}”,但互联网搜索和 ChatGPT 都无法建议如何根据其他下拉菜单的当前值更改帧/跟踪的可见性。

这是一个有点做作的例子;在我的实际用例中,我有三个滑块,分别具有 8、8 和 51 个选项,并且我不想创建具有 3264 个值的单个滑块。

python plotly plotly-python
1个回答
0
投票

问题是(使用更新菜单)不可能有一个下拉按钮起作用给定另一个下拉菜单的状态,即。按钮 args

 是静态的,您需要它们是动态的。

您需要一个函数回调来处理输入更改,并通过动态构建

{"visible": [...]}

 参数使下拉菜单协同工作,然后使用此参数手动调用plotly.js“更新”方法。您可以通过在渲染的 html 中添加一些 javascript 来实现此目的,即通过 
post_script
 方法传递 
show()
,@参见示例 
herehere)。

或者,您可以使用

Dash,它允许通过交互构建丰富的布局,它提供许多组件(包括 dropdowns),并运行服务器(即,这样您就可以让后端 callbacks 更新布局和 Plotly 图形) ,我的意思是不需要 JavaScript,尽管你仍然可以有客户端回调)。

© www.soinside.com 2019 - 2024. All rights reserved.