我不清楚如何一次动态创建多个图表 - 或者如果这不可能,那么我如何使用单个回调遍历值列表。
例如,在下面的代码中,大洲列表 是一个过滤器选项列表。是否可以基本上做到这一点,以便在加载此页面时自动看到 5 个图表?
目前,我正在做的是我必须输入 5 @app.callback...make_scatter_plot(option=_dropdown_value) 这最终会在我的文件中包含一百万行代码并使即使所有内容都在做同样的事情,也很难阅读。
我错过了什么?谢谢
from dash import Dash, dcc, html, Input, Output
import plotly.express as px
import pandas as pd
import numpy as np
app = Dash(__name__)
df = px.data.gapminder()
list_of_continents = ["Asia", "Africa", "Europe", 'Oceania', 'Americas']
app.layout = html.Div([
html.H4('Restaurant tips by day of week'),
dcc.Dropdown(
id="dropdown",
options=list_of_continents,
multi=False
),
dcc.Graph(id="graph"),
#dcc.Graph(id ='graph2') ##????
])
@app.callback(
Output("graph", "figure"),
Input("dropdown", "value")
)
def make_scatter_plot( value =[i for i in list_of_continents], df = df):
"""
"""
data = df[df['continent'].isin([value])]
fig = px.scatter(data, x="lifeExp", y="gdpPercap",
size="pop")
return fig
if __name__ == '__main__':
app.run_server(debug=True)
最佳答案
虽然 plotly express 可以帮助您仅用一行代码设置图表,但在自定义每条轨迹时并不是很方便。因此,为此,您必须切换到 graphs_objects。
在以下代码行中,回调为每个跟踪生成一个图形组件,并将每个图形组件附加到一个 Div 组件。因此,您可以使用单个回调获得多个图表。
from dash import Dash, dcc, html, Input, Output
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np
app = Dash(__name__)
df = px.data.gapminder()
app.layout = html.Div([
html.H4('Restaurant tips by day of week'),
html.Div(id='graphs',children=[])
])
@app.callback(
Output("graphs", "children"),
Input("graphs", "children")
)
def make_scatter_plot(child):
"""
"""
for continent in df['continent'].unique():
df_filtered = df[df['continent'] == continent]
fig = go.Figure()
fig.add_trace(
go.Scatter(x = df_filtered['lifeExp'],
y = df_filtered['gdpPercap'],
mode = 'markers',
marker = dict(size = 10 + (df_filtered['pop'] - df_filtered['pop'].min()) * 20
/ (df_filtered['pop'].max() - df_filtered['pop'].min())) # This is just to scale the marker size value between 10 and 20.
)
)
fig.update_layout(
title_text = continent
)
child.append(dcc.Graph(figure=fig))
return child
if __name__ == '__main__':
app.run_server(debug=True)
代码的输出: Click here
关于python - 使用破折号回调生成多个图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72412927/