提问人:Noskario 提问时间:11/18/2023 更新时间:11/21/2023 访问量:37
如何制作一个可以交互式更改着色参数的绘图图?
How do I make a plotly graph where I can change the coloring parameter interactively?
问:
在 plotly express 中,我可以轻松地使用 data.frames 创建散点图:
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(df, x="gdpPercap", y="lifeExp", log_x=True, color='continent')
有没有办法在绘图中添加下拉菜单,以便我也可以选择其他参数作为颜色?这样做不应重置缩放。
除了使用破折号应用程序之外,我无法弄清楚如何做到这一点,但我仍然有一些问题:悬停不会改变,并且无法在分类和数字着色之间切换。让我给你介绍一下我到目前为止所取得的成就:
import dash
from dash import dcc, html
from dash.dependencies import Input, Output
import plotly.express as px
import numpy as np
df = px.data.gapminder()
df["moreData1"] = np.random.normal(size = len(df))
labels = df.columns[df.dtypes=="float64"]
#labels = df.columns
options = [{'label': v, 'value': v} for v in labels]
app = dash.Dash(__name__)
fig = px.scatter(df,
x="gdpPercap",
y="lifeExp",
log_x=True,
color=labels[1],
#color='continent',
render_mode='webgl'
)
# somehow this line prevents from resetting the zoom. Do not really understand why.
fig.update_layout(uirevision='some_unique_value')
# Define the layout
app.layout = html.Div([
dcc.Dropdown(
id='color-dropdown',
options=options,
value=labels[-1]
),
dcc.Graph(
id='scatter-plot',
figure=fig
)
])
# Define the callback to update the scatter plot based on the selected color
@app.callback(
Output('scatter-plot', 'figure'),
[Input('color-dropdown', 'value')]
)
def update_scatter_plot(selected_color):
fig.update_traces(
marker_color=df[selected_color]
)
return fig
# Run the app
if __name__ == '__main__':
app.run(debug=True, port=8052)
它以某种方式工作,但我希望有两个改进:我也希望能够显示分类值(正如您通过设置而不是仅数字列所看到的那样不起作用。labels = df.columns
更重要的是,我想在悬停中显示着色信息。
没有必要使用破折号应用程序,我想我会对纯粹的情节情节感到更高兴。
答:
1赞
EricLavault
11/21/2023
#1
在回调中,您需要使用 (该图可以包含每个大洲 1 条轨迹,或每个国家/地区 1 条轨迹等,没有轨迹更新)。selected_color
此外,为了在更新之间保留缩放范围,您可以使用 读取当前范围并将其应用于新图窗。State()
# Define the callback to update the scatter plot based on the selected color
@app.callback(
Output('scatter-plot', 'figure'),
Input('color-dropdown', 'value'),
State('scatter-plot', 'figure'),
prevent_initial_call=True
)
def update_scatter_plot(selected_color, fig):
xrange = fig['layout']['xaxis']['range']
yrange = fig['layout']['yaxis']['range']
fig = px.scatter(df,
x="gdpPercap",
y="lifeExp",
log_x=True,
color=selected_color,
render_mode='webgl'
)
fig.update_layout(xaxis_range=xrange, yaxis_range=yrange)
return fig
评论
return px.scatter(df, x="gdpPercap", y="lifeExp", log_x=True, color=selected_color)