破折号图可视化

问题描述 投票:0回答:1

我正在尝试使用下拉菜单选择数据框的列,将它们放入绘图中。目前,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)

callback visualization plotly-dash scatter-plot interactive
1个回答
0
投票

我相信您问题的根源是函数参数不匹配。一个好的做法是指定参数而不是使用位置参数(例如

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)
© www.soinside.com 2019 - 2024. All rights reserved.