我试图包含两个单独的开关来改变散点图框的颜色和符号。颜色切换工作正常,而符号切换工作时,它会丢弃颜色。
我希望能够同时打开符号和颜色。可以吗?
注意:需要是scattermapbox
import dash
from dash import Dash, dcc, html, Input, Output
import plotly.express as px
import pandas as pd
import plotly.graph_objs as go
df = px.data.iris()
color_dict = {'versicolor': 'brown', 'setosa': 'orange', 'virginica': 'pink'}
symbol_dict = {'versicolor': 'star', 'setosa': 'circle', 'virginica': 'triangle'}
cmap = df["species"].map(color_dict)
smap = df["species"].map(symbol_dict)
app = dash.Dash(__name__)
app.layout = html.Div(
[
html.P("Toggle for the color"),
dcc.Checklist(
id="color_toggle",
options=[{"label": "", "value": True}],
value=[],
inline=True
),
html.P("Toggle for the symbol"),
dcc.Checklist(
id="symbol_toggle",
options=[{"label": "", "value": True}],
value=[],
inline=True
),
html.Div(
dcc.Graph(id="chart"),
),
]
)
@app.callback(
Output("chart", "figure"),
[Input("color_toggle", "value"),
Input("symbol_toggle", "value")
]
)
def update_fig(cmap_on, smap_on):
fig = go.Figure(go.Scattermapbox(
lat=df['sepal_width'],
lon=df['sepal_length'],
mode='markers',
marker=dict(color = cmap if cmap_on else None,
symbol = smap if smap_on else None,
)
)
)
fig.update_layout(height = 750,
mapbox=dict(
accesstoken=mapboxtoken,
style='light',
))
fig.update_mapboxes(zoom = 4)
return fig
if __name__ == "__main__":
app.run_server(debug=True)
此代码的问题在于在回调中将颜色和符号都设置为
None
,如果
cmap_on
或
smap_on
为 False。这意味着,如果任何一个开关关闭,颜色和符号都将被重置为其默认值。
若要解决此问题,需要分别检查颜色和符号,并仅在相应的开关关闭时才将其设置为
None
。
以下是如何执行此操作的更新后的回调函数:
@app.callback(
Output("chart", "figure"),
[Input("color_toggle", "value"),
Input("symbol_toggle", "value")]
)
def update_fig(cmap_on, smap_on):
# 为颜色和符号设置默认值
marker = dict()
# 如果颜色开关打开,则使用 cmap,否则使用默认颜色
if cmap_on:
marker['color'] = cmap
# 如果符号开关打开,则使用 smap,否则使用默认符号
if smap_on:
marker['symbol'] = smap
fig = go.Figure(go.Scattermapbox(
lat=df['sepal_width'],
lon=df['sepal_length'],
mode='markers',
marker=marker
)
)
fig.update_layout(height=750,
mapbox=dict(
accesstoken=mapboxtoken,
style='light',
))
fig.update_mapboxes(zoom=4)
return fig
在此代码中:
-
我们创建一个空的
marker
字典。 -
如果
cmap_on
为 True,我们将cmap
分配给marker['color']
。否则,我们将保留默认颜色。 -
如果
smap_on
为 True,我们将smap
分配给marker['symbol']
。否则,我们将保留默认符号。
通过这种方式,颜色和符号切换将独立工作,并且可以在不重置另一个的情况下启用或禁用一个。
标签:python,plotly,mapbox,plotly-dash From: 78805493