python - 在绘图中添加索引作为下拉菜单

标签 python plotly

我正在使用以下代码绘制图表:

fig = px.line(df, x='Time', y=['one','two'], color= df.index)
fig['layout']['xaxis']['autorange'] = "reversed"
fig.update_layout(legend_title="Price")
fig.show()

我正在使用的数据框如下:

      Time   one    two
100   9:30   129    243
110  10:30   234    453
120  11:00   155    234

想要添加下拉菜单以从索引中进行选择并在图表中一次显示一行。 例如,如果我从下拉列表中选择 110,它应该只显示该行的图表。 有什么简单的解决方法吗? 提前谢谢您。

最佳答案

这是我的解决方案:
为了为下拉菜单设置正确的选项,拥有一个创建选项列表的函数(如下所示)会很有帮助

# Create proper buttons list
def makeButtonsList(idxs):
    buttons = []
    for i, idx in enumerate(idxs):
        visibleArr = np.full((2*df.index.shape[0],), 
                             False, dtype=bool)       # 2x number of booleans since one/two vals are separate plots
        visibleArr[2*i] = True                        # Set two booleans next to each other (representing one & two) to true
        visibleArr[(2*i)+1] = True
        buttons.append(dict(label=str(idx),
                            method='update',
                            args=[{'visible': list(visibleArr)}]))    # 'Visible' arg determines which plots are shown 
                                                                      # depending on which dropdown is selected 
    return buttons

接下来创建数据的跟踪(使用您的示例数据,我创建了一个条形图,但您可以轻松修改它)

traces = []
for i in range(df.Time.shape[0]):
    rowData = df.iloc[i, :]
    time = rowData.Time
    one = rowData.one
    two = rowData.two
    traces.append(go.Bar(x=[time], y=[one], name='One'))
    traces.append(go.Bar(x=[time], y=[two], name='Two'))

其中 df 是您正在使用的数据框。

最后将它们组合在一起并创建 Plotly plotly !

# Import packages
import pandas as pd
import numpy as np

import plotly.graph_objs as go
import plotly.express as px

# Create proper buttons list
def makeButtonsList(idxs):
    buttons = []
    for i, idx in enumerate(idxs):
        visibleArr = np.full((2*df.index.shape[0],), 
                             False, dtype=bool)       # 2x number of booleans since one/two vals are separate plots
        visibleArr[2*i] = True                        # Set two booleans next to each other (representing one & two) to true
        visibleArr[(2*i)+1] = True
        buttons.append(dict(label=str(idx),
                            method='update',
                            args=[{'visible': list(visibleArr)}]))    # 'Visible' arg determines which plots are shown 
                                                                      # depending on which dropdown is selected 
    return buttons

# Create traces
traces = []
for i in range(df.Time.shape[0]):
    rowData = df.iloc[i, :]
    time = rowData.Time
    one = rowData.one
    two = rowData.two
    traces.append(go.Bar(x=[time], y=[one], name='One'))
    traces.append(go.Bar(x=[time], y=[two], name='Two'))

# Create figure
fig = go.Figure(data=traces)

# Add dropdown options
fig.update_layout(
    updatemenus=[
        dict(
            buttons=makeButtonsList(df.index),
            direction="down",
            pad={"r": 10, "t": 10},
            showactive=True,
            x=0.55,
            xanchor="left",
            y=1.2,
            yanchor="top"
        ),
    ]
)


# Add annotation for index selected
fig.update_layout(
    annotations=[
        dict(text="Index:", showarrow=False,
        x=0, y=1.15, yref="paper", align="left")
    ],
    xaxis_title = 'Time',
    yaxis_title = 'Value',
)

# Show the plot
fig.show()

这是一个示例图: Plot1

奖励: 如果您认为这种方法很乏味,而 slider 就可以很好地完成工作,那么 Plotly 支持条形图的动画。您可以使用以下代码:

fig = px.bar(df, x='Time', y=['one','two'], animation_frame=df.index)
fig.update_layout(title='Data', barmode='group')
fig.show()

这是结果图: Plot2

关于python - 在绘图中添加索引作为下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64893793/

相关文章:

python - 如何做 sftp python 3?

python - Django - 为什么这个模型没有创建 pk 并提示相关模型的 pk 的完整性?

R:更改 plot_ly 中的字体大小

r - 密谋:add_trace循环

python - 在Python中复制复合对象

python - 如何使用python pandas读取json文件?

python - Pandas - 堆叠多列

python - Plotly:根据导出数据中的列设置标记大小?

r - ggplot 到 ggplotly 不适用于自定义的 geom_boxplot 宽度

将曲面图中的线条删除到 x、y 和 z 平面