如何制作一个可以交互式更改着色参数的绘图图?

How do I make a plotly graph where I can change the coloring parameter interactively?

提问人:Noskario 提问时间:11/18/2023 更新时间:11/21/2023 访问量:37

问:

在 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

更重要的是,我想在悬停中显示着色信息。

没有必要使用破折号应用程序,我想我会对纯粹的情节情节感到更高兴。

蟒蛇 情节

评论

0赞 EricLavault 11/18/2023
在回调中,您需要使用选定的颜色 : 重建图窗。return px.scatter(df, x="gdpPercap", y="lifeExp", log_x=True, color=selected_color)
0赞 Noskario 11/20/2023
但这样一来,缩放就不会继续重绘。
0赞 EricLavault 11/21/2023
您可以重新应用当前缩放范围,您可以从图窗的状态中获取该范围。

答:

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