我有以下 pandas 数据框,我正在尝试使用
Plotly
绘制条形图,并通过下拉菜单通过股票名称列进行选择,参考这个答案。
但我不确定如何将多个列添加到
updatemenus
,因为列的名称可能会有所不同。
import plotly.graph_objects as go
# plotly setup
fig = go.Figure()
# Add traces, starting from First Column. Each column is a stock data.
for mycolumn in df.columns[1:]:
fig.add_traces( go.Scatter(x=list(df.Quarters), y=list(df[mycolumn])) )
updatemenus = None
for mycolumn in df.columns[1:]:
# construct menus
updatemenus = [{'buttons':
[{'method': 'update',
'label' : column, # what?
'args' : [{'y': [values_1, values_1b]},] # what?
}
'direction': 'down',
'showactive': True,}
]
# update layout with buttons, and show the figure
fig.update_layout(updatemenus=updatemenus)
fig.show()
参考数据框:
宿舍 | 526433 | AARTIIND | DEEPAKNTR | 绿色面板 | 麦德龙品牌 | 模具技术 | 穆夫提 | 穆特芬 | 雅修 | ZENTEC |
---|---|---|---|---|---|---|---|---|---|---|
3 月 21 日 | 4.6 | 1.69 | ||||||||
21 年 6 月 | 2.99 | 4.55 | 22.19 | 2.43 | 1.16 | 24.37 | 10.01 | -0.14 | ||
9 月 21 日 | 3.77 | 4.14 | 18.65 | 5.47 | 1.89 | 1.3 | 24.97 | 12.44 | 0 | |
12 月 21 日 | 4.3 | 20.01 | 17.78 | 5.14 | 3.69 | 0.59 | 25.91 | 12.71 | -0.02 | |
3 月 22 日 | 1.54 | 5.34 | 19.59 | 6.57 | 2.49 | 1.67 | 24.84 | 11.69 | 0.42 | |
22 年 6 月 | 3.35 | 3.75 | 17.2 | 6.33 | 3.8 | 1.1 | 20.41 | 16.99 | 0.94 | |
9 月 22 日 | 2.84 | 3.42 | 12.79 | 5.91 | 2.72 | 2.43 | 80.9 | 22.22 | 19.61 | 0.71 |
12 月 22 日 | 2.25 | 3.77 | 15.33 | 3.06 | 4.22 | 3.26 | 60.25 | 23.11 | 9.18 | 1.19 |
3 月 23 日 | 0.25 | 4.11 | 17.15 | 5.62 | 2.44 | 3.58 | 67.43 | 24.25 | 13.76 | 2.54 |
23 年 6 月 | 0.36 | 1.93 | 10.99 | 3.04 | 3.91 | 2.21 | 1.33 | 25.46 | 12.97 | 5.6 |
9 月 23 日 | -1.59 | 2.51 | 15.04 | 3.34 | 2.92 | 2.86 | 4.35 | 26.39 | 10.23 | 1.82 |
12 月 23 日 | -0.19 | 3.42 | 14.81 | 2.82 | 3.52 | 2.47 | 2.42 | 27.49 | 11.88 | 3.64 |
3 月 24 日 | -2.59 | 3.64 | 18.61 | 2.43 | 6.05 | 2.26 | 1.1 | 28.37 | 15.74 | 4.16 |
24 年 6 月 | 2.83 | 3.78 | 14.85 | 3.4 | 1.81 | 1.51 | 28.99 | -2.16 | 9.14 |
如链接的post中所述:
其中'y' = [values_1]
本身就是一个列表。values_1
因此,对于
'y': [df[col]]
中的每个 col
,我们都需要 df.iloc[:, 1:]
。对于 label
值,请使用 col
本身。另请确保仅为您的first列添加跟踪,因为这将为我们提供第一个选择的结果。
import plotly.graph_objects as go
fig = go.Figure()
# add trace only for first stock
x = df['Quarters']
y = df['526433']
fig.add_traces(go.Scatter(x=x, y=y))
# create `list` with a `dict` for each column
buttons = [{'method': 'update', 'label': col, 'args': [{'y': [df[col]]}]}
for col in df.iloc[:, 1:]]
# add menus
updatemenus = [{'buttons': buttons,
'direction': 'down',
'showactive': True,}]
# update layout with buttons, and show the figure
fig.update_layout(updatemenus=updatemenus)
fig.show()
输出:
使用的数据
import pandas as pd
import numpy as np
data = {'Quarters': {0: 'Mar-21', 1: 'Jun-21', 2: 'Sep-21', 3: 'Dec-21', 4: 'Mar-22',
5: 'Jun-22', 6: 'Sep-22', 7: 'Dec-22', 8: 'Mar-23', 9: 'Jun-23',
10: 'Sep-23', 11: 'Dec-23', 12: 'Mar-24', 13: 'Jun-24'},
'526433': {0: np.nan, 1: 2.99, 2: 3.77, 3: 4.3, 4: 1.54, 5: 3.35, 6: 2.84,
7: 2.25, 8: 0.25, 9: 0.36, 10: -1.59, 11: -0.19, 12: -2.59, 13: 2.83},
'AARTIIND': {0: np.nan, 1: 4.55, 2: 4.14, 3: 20.01, 4: 5.34, 5: 3.75, 6: 3.42,
7: 3.77, 8: 4.11, 9: 1.93, 10: 2.51, 11: 3.42, 12: 3.64, 13: 3.78},
'METROBRAND': {0: 1.69, 1: np.nan, 2: 1.89, 3: 3.69, 4: 2.49, 5: 3.8, 6: 2.72,
7: 4.22, 8: 2.44, 9: 3.91, 10: 2.92, 11: 3.52, 12: 6.05, 13: 3.4}
}
df = pd.DataFrame(data)