Plotly。如何使用updatemenus更新有多个附属轨迹的图?

问题描述 投票:1回答:1

我正在使用updatemenus更新一个散点图,它把我想更新的字段作为参数。

dict(label = category,
      method = 'update',
      args = [dict(x=[df[(df['cat_name'] == category) & (df['cat_level'] == cat_level)]['value']], 
                        y=[df[(df['cat_name'] == category) & (df['cat_level'] == cat_level)]['count']],
                        meta = [["Category:" + category]]
                                          )])

我有第二个我正在添加的轨迹(这是一条最佳匹配线),我希望随着菜单选择的改变而更新(当用户选择一个菜单类别时,视觉效果会随着该类别数据的更新而更新--因此最佳匹配线应该改变)。

有没有一种聪明的方法来构建这个?

python plot plotly visualization
1个回答
1
投票

如果你的soure是一个pandas数据框架,这里的关键是为它自己的数据框架中的每一列建立一个线性模型,然后为每一个源列和相关的线性模型添加一个带有按钮的下拉菜单,使用像这样的循环。

for col in df.columns:
    buttons.append(dict(method='restyle',
                        label=col,
                        visible=True,
                        args=[{'y':[df[col], df_reg[col+'_model']],
                               'x':[df.index],
                               'type':'scatter'}],
                        )
                  )

Plot 1: 列A和相关的线性模型。

enter image description here

Plot 2: Column B and associated linear model: Plot 2: B列和相关的线性模型。

enter image description here

完整的代码与可重复的数据样本。

# imports
import plotly.graph_objs as go
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime
# conda install -c anaconda scikit-learn
from sklearn.linear_model import LinearRegression #(conda install -c anaconda scikit-learn)

# data sample
nperiods=200
np.random.seed(123)
df = pd.DataFrame(np.random.randint(-10,12,size=(nperiods, 4)), columns=list('ABCD'))
datelist = pd.date_range(datetime(2020, 1, 1).strftime('%Y-%m-%d'), periods=nperiods).tolist()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df.iloc[0]=0
df=df.cumsum()

# build dataframe df_reg with linear models using sklearn
# for each column in df
df_reg = pd.DataFrame()
# regression
for col in df:
    #print(col)
    reg = LinearRegression().fit(np.vstack(np.arange(0, len(df))), df[col].values)
    df_reg[col+'_model'] = reg.predict(np.vstack(np.arange(0, len(df))))


#plotly
fig=go.Figure()

# set up one trace for source data in df
# and one trace for each linear model in df_reg
fig.add_trace(go.Scatter(x=df.index,
                             y=df[df.columns[0]],
                             visible=True))

fig.add_trace(go.Scatter(x=df.index,
                             y=df_reg[df_reg.columns[0]],
                             visible=True))
# Define updatemenus
updatemenu=[]
buttons=[]

# add buttons to select column in df
# and the associated linear model in df_reg
for col in df.columns:
    buttons.append(dict(method='restyle',
                        label=col,
                        visible=True,
                        args=[{'y':[df[col], df_reg[col+'_model']],
                               'x':[df.index],
                               'type':'scatter'}],
                        )
                  )

# some adjustments to the updatemenus
updatemenu=[]
your_menu=dict()
updatemenu.append(your_menu)

updatemenu[0]['buttons']=buttons
updatemenu[0]['direction']='down'
updatemenu[0]['showactive']=True

# add dropdown menus to the figure
fig.update_layout(showlegend=False, updatemenus=updatemenu)
fig.show()
© www.soinside.com 2019 - 2024. All rights reserved.