如何在 plotly python 中使用下拉按钮更新多个散点图的数据?
How to update data of multiple scatter plots with dropdown buttons in plotly python?
我在同一轴上有两个 variables/arrays 的两个散点图。我想添加一个下拉列表来更新 variables/arrays.
的数据
import numpy as np
import pandas as pd
from plotly import graph_objects as go
scen3_df = pd.DataFrame(np.random.randint(10, 20, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
orig_df = pd.DataFrame(np.random.randint(0, 10, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
first_title = scen3_df.columns.to_list()[0]
traces = []
buttons = []
for idx, col in enumerate(scen3_df.columns):
visible = [False]*8
visible[idx] = True
traces.append(go.Scatter(x=scen3_df.index, y=scen3_df[col],
name="Scenario 3",
visible = True if idx==0 else False,
))
traces.append(go.Scatter(x=scen3_df.index, y=orig_df[col],
name="Original",
visible = True if idx==0 else False,
))
buttons.append(dict(label=col,
method="update",
args=[{"visible": visible},
{"title": f" Gate operation at {col}"}]
))
updatemenus = [{'active':0, "buttons":buttons}]
fig = go.Figure(data=traces,
layout=dict(updatemenus=updatemenus))
fig.update_layout(title=first_title, title_x=0.5)
fig.update_yaxes(range=[0, scen3_df.max()], title="Gate Height (m)")
fig.update_xaxes(title="Time (Julian Day)")
fig.show()
fig.write_html("gate_operations.html")
我想要什么
我目前得到的
- 在构建这些类型的图形和菜单时,一致性始终是关键
- 实现与 Plotly Express 的一致性要简单得多,所以我切换到这个而不是 graph objects
- 为两个数据框建立两个图形,然后整合它们。名称被覆盖以确保图例显示如您所愿
- 构建图形后,其中包含构建嵌套菜单所需的所有信息 list comprehensions
import numpy as np
import pandas as pd
import plotly.express as px
scen3_df = pd.DataFrame(np.random.randint(10, 20, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
orig_df = pd.DataFrame(np.random.randint(0, 10, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
# generate equivalent figures for both data frames
figs = [
px.line(df, y=df.columns)
.update_traces(line_color=color, name=name)
.for_each_trace(lambda t: t.update(visible=t.legendgroup == df.columns[0]))
for df, color, name in zip(
[scen3_df, orig_df], ["blue", "red"], ["Scenario 3", "Original"]
)
]
# construct overall figure
fig = (
figs[0]
.add_traces(figs[1].data)
.update_layout(xaxis_title="Time (Julian Day)", yaxis_title="Gate Height (m)")
)
# build the menu
fig.update_layout(
updatemenus=[
{
"buttons": [
{
"label": col,
"method": "update",
"args": [
{"visible": [t.legendgroup == col for t in fig.data]},
{"title": f" Gate operation at {col}"},
],
}
for col in scen3_df.columns
]
}
]
)
我在同一轴上有两个 variables/arrays 的两个散点图。我想添加一个下拉列表来更新 variables/arrays.
的数据import numpy as np
import pandas as pd
from plotly import graph_objects as go
scen3_df = pd.DataFrame(np.random.randint(10, 20, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
orig_df = pd.DataFrame(np.random.randint(0, 10, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
first_title = scen3_df.columns.to_list()[0]
traces = []
buttons = []
for idx, col in enumerate(scen3_df.columns):
visible = [False]*8
visible[idx] = True
traces.append(go.Scatter(x=scen3_df.index, y=scen3_df[col],
name="Scenario 3",
visible = True if idx==0 else False,
))
traces.append(go.Scatter(x=scen3_df.index, y=orig_df[col],
name="Original",
visible = True if idx==0 else False,
))
buttons.append(dict(label=col,
method="update",
args=[{"visible": visible},
{"title": f" Gate operation at {col}"}]
))
updatemenus = [{'active':0, "buttons":buttons}]
fig = go.Figure(data=traces,
layout=dict(updatemenus=updatemenus))
fig.update_layout(title=first_title, title_x=0.5)
fig.update_yaxes(range=[0, scen3_df.max()], title="Gate Height (m)")
fig.update_xaxes(title="Time (Julian Day)")
fig.show()
fig.write_html("gate_operations.html")
我想要什么
我目前得到的
- 在构建这些类型的图形和菜单时,一致性始终是关键
- 实现与 Plotly Express 的一致性要简单得多,所以我切换到这个而不是 graph objects
- 为两个数据框建立两个图形,然后整合它们。名称被覆盖以确保图例显示如您所愿
- 构建图形后,其中包含构建嵌套菜单所需的所有信息 list comprehensions
import numpy as np
import pandas as pd
import plotly.express as px
scen3_df = pd.DataFrame(np.random.randint(10, 20, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
orig_df = pd.DataFrame(np.random.randint(0, 10, (100, 8)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
# generate equivalent figures for both data frames
figs = [
px.line(df, y=df.columns)
.update_traces(line_color=color, name=name)
.for_each_trace(lambda t: t.update(visible=t.legendgroup == df.columns[0]))
for df, color, name in zip(
[scen3_df, orig_df], ["blue", "red"], ["Scenario 3", "Original"]
)
]
# construct overall figure
fig = (
figs[0]
.add_traces(figs[1].data)
.update_layout(xaxis_title="Time (Julian Day)", yaxis_title="Gate Height (m)")
)
# build the menu
fig.update_layout(
updatemenus=[
{
"buttons": [
{
"label": col,
"method": "update",
"args": [
{"visible": [t.legendgroup == col for t in fig.data]},
{"title": f" Gate operation at {col}"},
],
}
for col in scen3_df.columns
]
}
]
)