Ben*_*del 3 python pandas plotly
我制作了一个折线图,其中的线条太多而无法整齐显示,我需要能够选择一个分组变量(省)并让它只显示该省中的线条(我在数据中有一个省列,说明哪个省它属于)。例如,我会在下拉列表中单击“安大略省”,然后只会显示与多伦多和渥太华等相对应的行。我究竟做错了什么?
import plotly.express as px
import plotly.offline as pyo
import pandas as pd
import plotly.graph_objects as go
df = pd.read_csv('....csv')
fig_opend = px.line(data_frame = df, x='Round', y='Excess Demand For Plot', title= 'Canada', color='Product' ,
hover_name='Service Area Name', hover_data=['Product Number', 'Excess Demand', '(Initial) Supply', 'Aggregate Demand', 'Round'])
fig_opend.update_yaxes(title = 'Excess Demand')
fig_opend.update_layout(margin={"r":20,"t":27,"l":10,"b":10}, xaxis={'tickformat':',d'})
updatemenus = [dict(buttons_open=list([dict(method='update', args=[{'y':[df.loc[df_opend['Areas'] == 'West']]}],),]),direction="down",showactive=True)]
fig_opend.update_layout(updatemenus=updatemenus)
Run Code Online (Sandbox Code Playgroud)
您所要做的就是:
1.为所有系列构建一个人物模型px.line(df, x=df.index, y = df.columns)
2.使用以下方法将您的线条/痕迹/系列映射到组:
maps = {'group 1': ['GOOG', 'AAPL', 'AMZN', 'FB'],
'group 2':['NFLX', 'MSFT']}
Run Code Online (Sandbox Code Playgroud)
(我正在使用px.data.stocks()数据集,因为你没有提供数据集)
3.设置一个列表列表,其中的迹线对于图中的哪些组可见:
[[True, True, True, True, False, False],
[False, False, False, False, True, True]]
Run Code Online (Sandbox Code Playgroud)
(不用担心,这将通过嵌套动态处理For Loop)。
4.使用这些列表通过按下以下位置的按钮来触发可见性:
button = dict(label=g,
method = 'restyle',
args = ['visible',visList[i]])
Run Code Online (Sandbox Code Playgroud)
下面的完整代码片段将产生下图:
例如,如果您选择,Group 2您将得到:
试一试,看看这是否是您想要的!
# imports
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
# data
df = px.data.stocks().set_index('date')
maps = {'group 1': ['GOOG', 'AAPL', 'AMZN', 'FB'],
'group 2':['NFLX', 'MSFT']}
# plotly figure
fig = px.line(df, x=df.index, y = df.columns)
# groups and trace visibilities
group = []
vis = []
visList = []
for m in maps.keys():
for col in df.columns:
if col in maps[m]:
vis.append(True)
else:
vis.append(False)
group.append(m)
visList.append(vis)
vis = []
# buttons for each group
buttons = []
for i, g in enumerate(group):
button = dict(label=g,
method = 'restyle',
args = ['visible',visList[i]])
buttons.append(button)
buttons = [{'label': 'all',
'method': 'restyle',
'args': ['visible', [True, True, True, True, True, True]]}] + buttons
# update layout with buttons
fig.update_layout(
updatemenus=[
dict(
type="dropdown",
direction="down",
buttons = buttons)
],
)
# buttons
fig.show()
Run Code Online (Sandbox Code Playgroud)