我正在尝试使用下拉菜单选择数据框的列,将它们放入绘图中。目前,x 和 y 是静态的,下拉列表可以更新列名称,但我无法更新图形本身以反映列内的数据。
我尝试将px.scatter y参数设置为filtered_df[“yaxis_column_name”],但由于没有真正的错误输出,我很难调整语法,我也尝试过调用一个对象来表示数据列(即 pnty)到位,它运行但仍然不更新图表。
from dash import Dash, dcc, html, Input, Output, callback
import plotly.express as px
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/RouseJo/DTSC691/main/Full.csv")
app = Dash(__name__)
app.layout = html.Div([
dcc.Dropdown(
df.columns,
'Columns',
id='xaxis-column'
),
dcc.Dropdown(
df.columns,
'Columns',
id='yaxis-column'
),
dcc.Graph(id='graph-with-slider'),
dcc.Slider(
df['yr'].min(),
df['yr'].max(),
step=None,
value=df['yr'].min(),
marks={str(year): str(year) for year in df['yr'].unique()},
id='year-slider'
)
])
@callback(
Output('graph-with-slider', 'figure'),
Input('year-slider', 'value'),
Input('xaxis-column', 'value'),
Input('yaxis-column', 'value')
)
def update_figure(selected_year, xaxis_column_name, yaxis_column_name):
filtered_df = df[df['yr'] == selected_year]
pntx = print(xaxis_column_name)
pnty = print(yaxis_column_name)
fig = px.scatter(df, x="TMP", y="SPFH",
size="wid", color="len", hover_name="SPFH",
log_x=True, size_max=55)
fig.update_yaxes(title=yaxis_column_name,
type='linear')
fig.update_layout(transition_duration=500)
return fig
if __name__ == '__main__':
app.run(debug=True)
我相信您问题的根源是函数参数不匹配。一个好的做法是指定参数而不是使用位置参数(例如
px.scatter([1,2,3], [4,5,6])
与 pc.scatter(x=[1,2,3], y=[4,5,6])
。
"Columns"
被设置为每个下拉列表中的值,即使它不是数据框中的列。
dcc.Dropdown
的 value
属性的一些令人困惑的注释:value
可以破坏向用户显示的输入设置的规则。value
均设置为 "Columns"
,即使它不是 df.columns
中的有效选项。即使下拉列表没有显示所选的 "Column"
,但在幕后它仍然会被使用。我强烈建议阅读
dash
的教程 (https://dash.plotly.com/tutorial),因为掌握这些细节对于成为一名成功的 dash
应用程序开发人员至关重要。
import pandas as pd
import plotly.express as px
from dash import Dash, Input, Output, callback, dcc, html
df = pd.read_csv("https://raw.githubusercontent.com/RouseJo/DTSC691/main/Full.csv")
app = Dash(__name__)
app.layout = html.Div(
[
dcc.Dropdown(options=df.columns, id="xaxis-column"),
dcc.Dropdown(options=df.columns, id="yaxis-column"),
dcc.Graph(id="graph-with-slider"),
dcc.Slider(
df["yr"].min(),
df["yr"].max(),
step=None,
value=df["yr"].min(),
marks={str(year): str(year) for year in df["yr"].unique()},
id="year-slider",
),
]
)
@callback(
Output("graph-with-slider", "figure"),
Input("year-slider", "value"),
Input("xaxis-column", "value"),
Input("yaxis-column", "value"),
)
def update_figure(selected_year, xaxis_column_name, yaxis_column_name):
filtered_df = df[df["yr"] == selected_year]
fig = px.scatter(
filtered_df,
x=xaxis_column_name,
y=yaxis_column_name,
size="wid",
color="len",
hover_name="SPFH",
log_x=True,
size_max=55,
)
fig.update_yaxes(title=yaxis_column_name, type="linear")
fig.update_layout(transition_duration=500)
return fig
if __name__ == "__main__":
app.run(debug=True)