在 plotly 中添加索引作为下拉菜单

Add index as dropdown menu in plotly(在 plotly 中添加索引作为下拉菜单)
本文介绍了在 plotly 中添加索引作为下拉菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

奖励:如果您认为这种方法很乏味,并且滑动条就可以完成这项工作,那么 Plotly 支持条形图的动画.以下是您可以使用的代码:

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

这是结果图:

I am plotting chart using below code:

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()

Dataframe i am working with like is below:

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

Want to add dropdown menu to select from index and show one row at a time in chart. example if i select 110 from drop down it should only show chart for that row. Is there any easy fix for it. Thank you in adavance.

解决方案

Here's my solution:
In order to set the proper options for the dropdown menu, it would be helpful to have a function that creates the list of options (shown below)

# 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

Next create the traces for the data (with your sample data, I created a bar chart but you could easily modify this)

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'))

where df is the dataframe you are working with.

Finally put it all together and create the Plotly plot!

# 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()

Here is a sample plot:

BONUS: If you think this method is tedious, and a slider bar would do the job just fine, Plotly supports animation of bar charts. Here is the following code you could use:

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

Here is the resulting plot:

这篇关于在 plotly 中添加索引作为下拉菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)