如何在单个浏览器页面上向 Dash 应用程序添加多个图表?

Posted

技术标签:

【中文标题】如何在单个浏览器页面上向 Dash 应用程序添加多个图表?【英文标题】:How to add multiple graphs to Dash app on a single browser page? 【发布时间】:2020-12-07 02:17:50 【问题描述】:

如何在同一页面上添加多个显示在图片中的图表?我正在尝试将 html.Div 组件添加到以下代码以更新页面布局以在单个页面上添加更多类似的图形,但是这些新添加的图形不会显示在页面上,只有旧图形显示在图片中可见。我应该修改什么元素,比如说在浏览器的dash应用程序的单个页面上添加3次上传图像中显示的图形?


import dash
import dash_core_components as dcc
import dash_html_components as html
i[enter image description here][1]mport plotly.express as px
import pandas as pd

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# assume you have a "long-form" data frame
# see https://plotly.com/python/px-arguments/ for more options
df = pd.DataFrame(
    "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
    "Amount": [4, 1, 2, 2, 4, 5],
    "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
)

fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group")

app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for Python.
    '''),

    dcc.Graph(
        id='example-graph',
        figure=fig
    )
])

if __name__ == '__main__':
    app.run_server(debug=True)

【问题讨论】:

【参考方案1】:

要多次添加同一个数字,您只需扩展您的app.layout。我在下面扩展了您的代码作为示例。

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import pandas as pd
import plotly.express as px

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# assume you have a "long-form" data frame
# see https://plotly.com/python/px-arguments/ for more options
df_bar = pd.DataFrame(
    "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
    "Amount": [4, 1, 2, 2, 4, 5],
    "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
)

fig = px.bar(df_bar, x="Fruit", y="Amount", color="City", barmode="group")

app.layout = html.Div(children=[
    # All elements from the top of the page
    html.Div([
        html.H1(children='Hello Dash'),

        html.Div(children='''
            Dash: A web application framework for Python.
        '''),

        dcc.Graph(
            id='graph1',
            figure=fig
        ),  
    ]),
    # New Div for all elements in the new 'row' of the page
    html.Div([
        html.H1(children='Hello Dash'),

        html.Div(children='''
            Dash: A web application framework for Python.
        '''),

        dcc.Graph(
            id='graph2',
            figure=fig
        ),  
    ]),
])

if __name__ == '__main__':
    app.run_server(debug=True)

我构建布局的方式是嵌套html.Div 组件。对于每个图形和相应的标题、文本等,我们创建另一个 html.Div,在我们的应用程序中创建一个新的“行”。

要记住的一件事是,不同的组件需要唯一的 ID。在此示例中,我们将相同的图表显示了两次,但它们不是完全相同的对象。我们正在使用相同的 plotly.express 图制作两个 dcc.Graph 对象

我已经为您制作了另一个示例,其中我添加了另一个 动态 图形。每次从下拉菜单中选择新的色标时,都会更新第二个数字。这是 Dash 谎言的真正潜力。您可以在 tutorial

中阅读有关回调函数的更多信息
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import pandas as pd
import plotly.express as px

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# assume you have a "long-form" data frame
# see https://plotly.com/python/px-arguments/ for more options
df_bar = pd.DataFrame(
    "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
    "Amount": [4, 1, 2, 2, 4, 5],
    "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
)

fig = px.bar(df_bar, x="Fruit", y="Amount", color="City", barmode="group")

# Data for the tip-graph
df_tip = px.data.tips()

app.layout = html.Div(children=[
    # All elements from the top of the page
    html.Div([
        html.H1(children='Hello Dash'),

        html.Div(children='''
            Dash: A web application framework for Python.
        '''),

        dcc.Graph(
            id='example-graph',
            figure=fig
        ),  
    ]),
    # New Div for all elements in the new 'row' of the page
    html.Div([ 
        dcc.Graph(id='tip-graph'),
        html.Label([
            "colorscale",
            dcc.Dropdown(
                id='colorscale-dropdown', clearable=False,
                value='bluyl', options=[
                    'label': c, 'value': c
                    for c in px.colors.named_colorscales()
                ])
        ]),
    ])
])

# Callback function that automatically updates the tip-graph based on chosen colorscale
@app.callback(
    Output('tip-graph', 'figure'),
    [Input("colorscale-dropdown", "value")]
)
def update_tip_figure(colorscale):
    return px.scatter(
        df_color, x="total_bill", y="tip", color="size",
        color_continuous_scale=colorscale,
        render_mode="webgl", title="Tips"
    )

if __name__ == '__main__':
    app.run_server(debug=True)

您的下一个问题可能是,我如何将多个数字并排放置? 这就是 CSS 和样式表很重要的地方。

您已经添加了一个外部样式表https://codepen.io/chriddyp/pen/bWLwgP.css,这使我们能够使用div 的className 组件更好地构建我们的布局。

无论屏幕大小如何,网页的宽度都设置为 12 列。因此,如果我们想要并排放置两个图形,每个图形占据 50% 的屏幕,它们需要每个填充 6 列。

我们可以通过嵌套另一个html.Div 作为我们的上半行来实现这一点。在上面的 div 中,我们可以有另外两个 div,我们在其中根据 classname six columns 指定样式。这会将第一行分成两半

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import pandas as pd
import plotly.express as px
from jupyter_dash import JupyterDash

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

# assume you have a "long-form" data frame
# see https://plotly.com/python/px-arguments/ for more options
df_bar = pd.DataFrame(
    "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
    "Amount": [4, 1, 2, 2, 4, 5],
    "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
)

fig = px.bar(df_bar, x="Fruit", y="Amount", color="City", barmode="group")

app.layout = html.Div(children=[
    # All elements from the top of the page
    html.Div([
        html.Div([
            html.H1(children='Hello Dash'),

            html.Div(children='''
                Dash: A web application framework for Python.
            '''),

            dcc.Graph(
                id='graph1',
                figure=fig
            ),  
        ], className='six columns'),
        html.Div([
            html.H1(children='Hello Dash'),

            html.Div(children='''
                Dash: A web application framework for Python.
            '''),

            dcc.Graph(
                id='graph2',
                figure=fig
            ),  
        ], className='six columns'),
    ], className='row'),
    # New Div for all elements in the new 'row' of the page
    html.Div([
        html.H1(children='Hello Dash'),

        html.Div(children='''
            Dash: A web application framework for Python.
        '''),

        dcc.Graph(
            id='graph3',
            figure=fig
        ),  
    ], className='row'),
])

if __name__ == '__main__':
    app.run_server(debug=True)

【讨论】:

以上是关于如何在单个浏览器页面上向 Dash 应用程序添加多个图表?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Delphi 应用程序添加多用户功能? [关闭]

如何在 Android 的警报对话框中添加多项选择复选框?

Oracle Sql:如何在 sql 中添加多个子总计?

如何添加多对多的额外数据透视列?

如何使用poi在excel中添加多选下拉菜单

VUE 学院:如何给视频添加多段音乐?