Python 带有两个下拉菜单的 Plotly 图表更新
Python Plotly chart update with two dropdowns
我正在尝试在 Jupyter Lab 中构建一个 plotly 散点图,以便能够查看 DataFrame 中各个列之间的依赖关系。
我想要两个下拉菜单(对应于 X 和 Y 轴),每个下拉菜单中都有一个完整的 DF 列列表。当我 select 任何菜单中的一列时,相应轴上的数据应替换为我 select 编辑的列(因此,如果我 select X 和Y,我希望是一条直线)。
下面是我当前使用示例 DataFrame 的实现:
# Creating the DataFrame
temp = pd.DataFrame(np.random.randint(0, 1000, (100, 10)))
col_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
temp.columns = col_list
# Init figure with the A column on both axes by default
fig = go.Figure()
default_col = 0
fig.add_trace(
go.Scatter(
x=temp[col_list[default_col]].values,
y=temp[col_list[default_col]].values,
name="Metric correlation",
mode="markers"
),
)
fig.update_xaxes(title_text=col_list[default_col])
fig.update_yaxes(title_text=col_list[default_col])
col_list = temp.columns
# Building options for each of the lists
btns_x = [
dict(
label=c,
method="update",
args=[
{"x": temp[c].fillna(0).values,
'xaxis': {'title': c}
}],
) for c in col_list]
btns_y = [
dict(
label=c,
method="update",
args=[
{"y": temp[c].fillna(0).values,
'yaxis': {'title': c}
}],
) for c in col_list]
# Adding the lists to the figure
fig.update_layout(
updatemenus=[
dict(
buttons=btns_x,
# method="update",
direction="down",
pad={"r": 10, "t": 10},
showactive=True,
x=0.1,
xanchor="left",
y=1.1,
yanchor="top"
),
dict(
buttons=btns_y,
# method="update",
direction="down",
pad={"r": 10, "t": 10},
showactive=True,
x=0.1,
xanchor="right",
y=1.1,
yanchor="top"
),
]
)
fig.update_layout(width=1000, height=1000)
fig.show()
该图最初绘制正确:
仍然存在一些问题:
- 当我更改下拉列表中的值时,它只起作用一次。在接下来的尝试中没有任何反应
- 如果我先更改一个下拉菜单的值,然后再更改另一个下拉菜单的值,所有数据都会从图表中消失(见下面的屏幕截图)
- 轴标签未更新
这只是围绕列表理解进行系统化。下面完全有效,允许选择任何列并更新适当的轴标题。
import pandas as pd
import numpy as np
import plotly.express as px
temp = pd.DataFrame(np.random.randint(0, 1000, (100, 10)))
col_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
temp.columns = col_list
fig = px.scatter(temp, x="A", y="B")
fig.update_layout(
updatemenus=[
{
"buttons": [
{
"label": c,
"method": "update",
"args": [
{axis: [temp[c]]},
{f"{axis}axis": {"title": {"text": c}}},
],
}
for c in temp.columns
],
"x": 0 if axis == "x" else 0.1,
"y": 1.2,
}
for axis in "xy"
]
)
我正在尝试在 Jupyter Lab 中构建一个 plotly 散点图,以便能够查看 DataFrame 中各个列之间的依赖关系。 我想要两个下拉菜单(对应于 X 和 Y 轴),每个下拉菜单中都有一个完整的 DF 列列表。当我 select 任何菜单中的一列时,相应轴上的数据应替换为我 select 编辑的列(因此,如果我 select X 和Y,我希望是一条直线)。
下面是我当前使用示例 DataFrame 的实现:
# Creating the DataFrame
temp = pd.DataFrame(np.random.randint(0, 1000, (100, 10)))
col_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
temp.columns = col_list
# Init figure with the A column on both axes by default
fig = go.Figure()
default_col = 0
fig.add_trace(
go.Scatter(
x=temp[col_list[default_col]].values,
y=temp[col_list[default_col]].values,
name="Metric correlation",
mode="markers"
),
)
fig.update_xaxes(title_text=col_list[default_col])
fig.update_yaxes(title_text=col_list[default_col])
col_list = temp.columns
# Building options for each of the lists
btns_x = [
dict(
label=c,
method="update",
args=[
{"x": temp[c].fillna(0).values,
'xaxis': {'title': c}
}],
) for c in col_list]
btns_y = [
dict(
label=c,
method="update",
args=[
{"y": temp[c].fillna(0).values,
'yaxis': {'title': c}
}],
) for c in col_list]
# Adding the lists to the figure
fig.update_layout(
updatemenus=[
dict(
buttons=btns_x,
# method="update",
direction="down",
pad={"r": 10, "t": 10},
showactive=True,
x=0.1,
xanchor="left",
y=1.1,
yanchor="top"
),
dict(
buttons=btns_y,
# method="update",
direction="down",
pad={"r": 10, "t": 10},
showactive=True,
x=0.1,
xanchor="right",
y=1.1,
yanchor="top"
),
]
)
fig.update_layout(width=1000, height=1000)
fig.show()
该图最初绘制正确:
仍然存在一些问题:
- 当我更改下拉列表中的值时,它只起作用一次。在接下来的尝试中没有任何反应
- 如果我先更改一个下拉菜单的值,然后再更改另一个下拉菜单的值,所有数据都会从图表中消失(见下面的屏幕截图)
- 轴标签未更新
这只是围绕列表理解进行系统化。下面完全有效,允许选择任何列并更新适当的轴标题。
import pandas as pd
import numpy as np
import plotly.express as px
temp = pd.DataFrame(np.random.randint(0, 1000, (100, 10)))
col_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
temp.columns = col_list
fig = px.scatter(temp, x="A", y="B")
fig.update_layout(
updatemenus=[
{
"buttons": [
{
"label": c,
"method": "update",
"args": [
{axis: [temp[c]]},
{f"{axis}axis": {"title": {"text": c}}},
],
}
for c in temp.columns
],
"x": 0 if axis == "x" else 0.1,
"y": 1.2,
}
for axis in "xy"
]
)