[英]How can I update the third plot in plotly with dropdown menu?
我有一個類似的問題。 我也試過你的解決方案。 但這一次,我有三個痕跡。 兩張圖在同一個 plot 中。 第三個是桌子。 這是我的代碼:
import pandas as pd
import plotly.tools as plotly_tools
import plotly.graph_objs as go
from plotly.subplots import make_subplots
df1 = pd.DataFrame({"SALES_DATE" : ["2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01",
"2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01",
"2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01"],
"y" : [12, 10, 11, np.nan, np.nan, 12, 10, 11, np.nan, np.nan, 12, 10, 11, np.nan, np.nan],
"y_hat" : [np.nan, np.nan, np.nan, 10, 12, np.nan, np.nan, np.nan, 10, 12, np.nan, np.nan, np.nan, 10, 12],
"ITEM_ID" : ["32_2_1004", "32_2_1004", "32_2_1004", "32_2_1004", "32_2_1004",
"32_2_1005", "32_2_1005", "32_2_1005", "32_2_1005", "32_2_1005",
"32_2_1006", "32_2_1006", "32_2_1006", "32_2_1006", "32_2_1006"]}
)
df2 = pd.DataFrame({"ITEM_ID": ["32_2_1004", "32_2_1005", "32_2_1006"],
"PREDICTION_ERROR": [2, 1, 0],
"PREDICTION": [22, 23, 24]})
item_list = ["32_2_1004", "32_2_1005", "32_2_1006"]
def make_multi_plot(df1, df2, item_list):
date_time = str(datetime.datetime.now())[0:16].replace(':','-').replace(' ','_')
with open('Model_Raporu_'+date_time+'.html', 'a') as f:
fig = make_subplots(rows=2,
cols=1,
shared_xaxes=True,
vertical_spacing=0.05,
specs = [[{}], [{"type": "table"}]]
)
for item_id in item_list:
trace1 = go.Scatter(
x=df1.loc[df1.ITEM_ID.isin([item_id])].SALES_DATE,
y=df1.loc[df1.ITEM_ID.isin([item_id])].y,
mode='lines+markers',
name = "orjinal - " + str(item_id))
fig.append_trace(trace1,1,1)
trace1x = go.Scatter(
x=df1.loc[df1.ITEM_ID.isin([item_id])].SALES_DATE,
y=df1.loc[df1.ITEM_ID.isin([item_id])].y_hat,
mode='lines+markers',
name = "tahmin - " + str(item_id))
fig.append_trace(trace1x,1,1)
trace2 = go.Table(
header = dict(
values = df2[df2.ITEM_ID.isin([item_id])].columns.tolist(),
font = dict(size=10),
align = "left"),
cells = dict(
values = [df2[df2.ITEM_ID.isin([item_id])][k].tolist() for k in df2[df2.ITEM_ID.isin([item_id])].columns[:]],
align = "left"
)
)
fig.append_trace(trace2,2,1)
Ld = len(fig.data)
Lc = len(item_list)
for k in range(3, Ld):
fig.update_traces(visible=False, selector = k)
def create_layout_button(k, item_id):
visibility= [False]*3*Lc
for tr in [3*k, 3*k+1]:
visibility[tr] =True
return dict(label = item_id,
method = 'restyle',
args = [{'visible': visibility,
'title': item_id,
'showlegend': True}])
fig.update_layout(
updatemenus=[go.layout.Updatemenu(
active = 0,
buttons = [create_layout_button(k, item_id) for k, item_id in enumerate(item_list)],
x = 0.5,
y = 1.15
)
],
title = 'Model Raporu',
template = 'plotly_dark',
height=800
)
fig.show()
f.write(fig.to_html(full_html=False, include_plotlyjs='cdn'))
make_subplots(df1=df1, df2=df2, item_list=item_list)
更改下拉按鈕時,只有上圖會發生變化。 但表保持不變。 我無法通過下拉菜單更改它。 這是圖像:
如何使用下拉菜單更改表格?
如果您使用print()
查看變量中的值,那么為了visibility
,您應該看到
[True, True, False, False, False, False, False, False, False]
[False, False, False, True, True, False, False, False, False]
[False, False, False, False, False, False, True, True, False]
所以每個列表只有 2 個True
但他們應該有 3 個True
您創建了錯誤的列表visibility
- 您必須添加3*k+2
for tr in [3*k, 3*k+1, 3*k+2]:
visibility[tr] = True
完整的工作代碼。
當我使用dropdown
時,我更改了df
中的一些值以查看不同的 plot 。
import pandas as pd
import plotly.tools as plotly_tools
import plotly.graph_objs as go
from plotly.subplots import make_subplots
import numpy as np
import datetime
# --- functions ---
def make_multi_plot(df1, df2, item_list):
#date_time = str(datetime.datetime.now())[0:16].replace(':','-').replace(' ','_')
#print(date_time)
date_time = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')
#print(date_time)
with open('Model_Raporu_'+date_time+'.html', 'a') as f:
fig = make_subplots(rows=2,
cols=1,
shared_xaxes=True,
vertical_spacing=0.05,
specs = [[{}], [{"type": "table"}]]
)
for item_id in item_list:
#print('item_id:', item_id)
trace1 = go.Scatter(
x=df1.loc[df1.ITEM_ID.isin([item_id])].SALES_DATE,
y=df1.loc[df1.ITEM_ID.isin([item_id])].y,
mode='lines+markers',
name = "orjinal - " + str(item_id))
fig.append_trace(trace1, 1, 1)
trace1x = go.Scatter(
x=df1.loc[df1.ITEM_ID.isin([item_id])].SALES_DATE,
y=df1.loc[df1.ITEM_ID.isin([item_id])].y_hat,
mode='lines+markers',
name = "tahmin - " + str(item_id))
fig.append_trace(trace1x,1,1)
trace2 = go.Table(
header=dict(
values = df2[df2.ITEM_ID.isin([item_id])].columns.tolist(),
font = dict(size=10),
align = "left"
),
cells = dict(
values = [df2[df2.ITEM_ID.isin([item_id])][k].tolist() for k in df2[df2.ITEM_ID.isin([item_id])].columns[:]],
align = "left"
)
)
fig.append_trace(trace2,2,1)
Ld = len(fig.data)
Lc = len(item_list)
for k in range(3, Ld):
fig.update_traces(visible=False, selector=k)
def create_layout_button(k, item_id):
#print(k, item_id)
visibility = [False]*3*Lc
for tr in [3*k, 3*k+1, 3*k+2]:
visibility[tr] = True
#print(visibility)
return dict(label = item_id,
method = 'restyle',
args = [{'visible': visibility,
'title': item_id,
'showlegend': True}])
fig.update_layout(
updatemenus=[go.layout.Updatemenu(
active=0,
buttons=[create_layout_button(k, item_id) for k, item_id in enumerate(item_list)],
x=0.5,
y=1.15
)],
title='Model Raporu',
template='plotly_dark',
height=800
)
fig.show()
f.write(fig.to_html(full_html=False, include_plotlyjs='cdn'))
# --- main ---
df1 = pd.DataFrame({
"SALES_DATE": [
"2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01",
"2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01",
"2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01",
],
"y": [
12, 10, 11, np.nan, np.nan,
12, 15, 11, np.nan, np.nan,
12, 10, 21, np.nan, np.nan,
],
"y_hat": [
np.nan, np.nan, np.nan, 10, 12,
np.nan, np.nan, np.nan, 15, 12,
np.nan, np.nan, np.nan, 12, 12,
],
"ITEM_ID": [
"32_2_1004", "32_2_1004", "32_2_1004", "32_2_1004", "32_2_1004",
"32_2_1005", "32_2_1005", "32_2_1005", "32_2_1005", "32_2_1005",
"32_2_1006", "32_2_1006", "32_2_1006", "32_2_1006", "32_2_1006",
]
})
df2 = pd.DataFrame({
"ITEM_ID": ["32_2_1004", "32_2_1005", "32_2_1006"],
"PREDICTION_ERROR": [2, 1, 0],
"PREDICTION": [22, 23, 24]
})
item_list = ["32_2_1004", "32_2_1005", "32_2_1006"]
make_multi_plot(df1=df1, df2=df2, item_list=item_list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.