【问题标题】:Plotly: How to add dropdown menu for every subplot?Plotly:如何为每个子图添加下拉菜单?
【发布时间】:2021-03-13 07:22:29
【问题描述】:

我需要为每个图表创建两个带有下拉菜单和标题的子图。 (并排比较)。另外,我想要一个共享的 y 轴。

就目前而言,我只有一个下拉菜单可以更改两个图表。

代码如下:(注意 df 由 2 列和 datetimeindex 组成)。


    import plotly.offline as py
    import plotly.graph_objs as go
    from plotly.offline import init_notebook_mode, iplot, plot
    from plotly import tools
    
    labels = ["Vol", "R"]
    
    
    fig = tools.make_subplots(rows=1, cols=2)
    
    trace1 = go.Scatter(x=df.index,
                             y=df['Stock1'].rolling(window=12).std(),
                             mode='lines'
                            )
    trace2 = go.Scatter(x=df.index,
                             y=df['Stock1'],
                             mode='lines'
                            )
    
    fig.append_trace(trace1, 1, 1)
    fig.append_trace(trace2, 1, 1)
    
    trace1 = go.Scatter(x=df.index,
                             y=df['Stock2'].rolling(window=12).std(),
                             mode='lines'
                            )
    trace2 = go.Scatter(x=df.index,
                             y=df['Stock2'],
                             mode='lines'
                            )   
    fig.append_trace(trace1, 1, 2)
    fig.append_trace(trace2, 1, 2)
    
    
    # Create buttons for drop down menu
    buttons = []
    for i, label in enumerate(labels):
        visibility = [i==j for j in range(len(labels))]
        button = dict(
                     label =  label,
                     method = 'update',
                     args = [{'visible': visibility},
                         {'title': label}])
        buttons.append(button)
    
    updatemenus = list([
        dict(active=-1,
             x=-0.15,
             buttons=buttons
        )
    ])
    
    fig['layout']['title'] = 'Title'
    fig['layout']['showlegend'] = False
    fig['layout']['updatemenus'] = updatemenus
    
    iplot(fig, filename='dropdown')

【问题讨论】:

    标签: button drop-down-menu plotly trace subplot


    【解决方案1】:

    根据 Plotly 论坛中的empet's helpful answer,重要的是要知道visible 键的长度等于fig.data 中的跟踪总数。

    在您的情况下,您有四个跟踪,分别对应于 Stock 1 (Vol)、Stock 1 (R)、Stock 2 (Vol) 和 Stock 2 (R),这是您添加这些跟踪的顺序。因此我们可以创建 4 个按钮来切换每个跟踪的可见性功能,并将它们作为列表传递给 updatemenus 字典。

    import numpy as np
    import pandas as pd
    
    import plotly.offline as py
    import plotly.graph_objs as go
    from plotly.offline import init_notebook_mode, iplot, plot
    from plotly import tools
    
    ## recreate some random data
    np.random.seed(42)
    df = pd.DataFrame(data=np.random.randint(0,100,(365,2)), columns=['Stock1','Stock2'], index=pd.date_range(start='1/1/2019', end='12/31/2019'))
    
    labels = ["Vol", "R"]
    
    
    fig = tools.make_subplots(rows=1, cols=2)
    
    trace1 = go.Scatter(x=df.index,
                             y=df['Stock1'].rolling(window=12).std(),
                             mode='lines'
                            )
    trace2 = go.Scatter(x=df.index,
                             y=df['Stock1'],
                             mode='lines'
                            )
    
    fig.append_trace(trace1, 1, 1)
    fig.append_trace(trace2, 1, 1)
    
    trace1 = go.Scatter(x=df.index,
                             y=df['Stock2'].rolling(window=12).std(),
                             mode='lines'
                            )
    trace2 = go.Scatter(x=df.index,
                             y=df['Stock2'],
                             mode='lines'
                            )   
    fig.append_trace(trace1, 1, 2)
    fig.append_trace(trace2, 1, 2)
    
    
    ## visible key for traces are in the order you append them
    
    button1 = dict(method='update', 
                   args=[{"visible": [True, False, False, False] }], 
                   label="Stock 1, Vol" )
    button2 = dict(method='update', 
                   args=[{"visible": [False, True, False, False] }], 
                   label="Stock 1, R" )   
    button3 = dict(method='update', 
                   args=[{"visible": [False, False, True, False] }], 
                   label="Stock 2, Vol" )
    button4 = dict(method='update', 
                   args=[{"visible": [False, False, False, True] }], 
                   label="Stock 2, R" )   
    
    updatemenus = list([
        dict(active=-1,
             x=-0.15,
             buttons=[button1, button2, button3, button4]
        )
    ])
    
    fig['layout']['title'] = 'Title'
    fig['layout']['showlegend'] = False
    fig['layout']['updatemenus'] = updatemenus
    
    iplot(fig, filename='dropdown')
    

    【讨论】:

    • 我想单独控制每个子图。换句话说,我想选择独立绘制的内容。例如,在第一个子图上,我想绘制 stock1,但在第二个子图上 - stock1 的波动性。 (想象一下,如果每个股票至少有 20 个图表)
    • 我明白了。我会试着弄清楚是否有办法让我的答案更普遍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2019-01-06
    • 2013-01-09
    • 2021-11-15
    相关资源
    最近更新 更多