Dash 数据可视化与 Plotly 集成实战
快速解决
import dash
from dash import dcc, html
import plotly.express as px
import pandas as pd
app = dash.Dash(__name__)
df = pd.DataFrame({
"x": [1, 2, 3, 4, 5],
"y": [10, 11, 12, 13, 14],
"category": ["A", "B", "A", "B", "A"]
})
fig = px.scatter(df, x="x", y="y", color="category")
app.layout = html.Div([
dcc.Graph(
id='example-graph',
figure=fig
)
])
if __name__ == '__main__':
app.run_server(debug=True)
常用方法
| 方法名 | 使用场景 | 示例代码片段 | 说明 |
|---|---|---|---|
dcc.Graph |
集成Plotly图表 | dcc.Graph(id='my-fig') |
核心组件,用于渲染图表 |
px.scatter |
散点图可视化 | px.scatter(df, x, y) |
支持多维数据展示 |
fig.update_layout |
修改图表样式 | fig.update_layout(title='') |
设置标题/配色/布局等 |
@app.callback |
动态交互更新 | @app.callback(Output(...)) |
实现参数联动 |
详细说明
基本图表集成
import dash
from dash import dcc, html
import plotly.express as px
app = dash.Dash(__name__)
df = px.data.iris()
fig = px.line(df, x='sepal_width', y='sepal_length', title='鸢尾花数据')
app.layout = html.Div([
html.H1("Plotly Dash集成示例"),
dcc.Graph(
id='line-plot',
figure=fig
)
])
多图表联动布局
from dash import dcc, html
import plotly.graph_objects as go
app.layout = html.Div([
# 左侧图表
dcc.Graph(
id='left-plot',
figure=go.Figure(data=go.Scatter(x=[1,2], y=[2,3]))
),
# 右侧图表
dcc.Graph(
id='right-plot',
figure=go.Figure(data=go.Bar(x=['A','B'], y=[10,20]))
)
])
动态参数绑定
from dash import Input, Output, callback
import dash
import plotly.express as px
import pandas as pd
app = dash.Dash(__name__)
df = pd.DataFrame({'x': [1,2,3], 'y': [2,4,5]})
app.layout = html.Div([
# 可交互下拉框
dcc.Dropdown(
id='graph-type',
options=[
{'label': '折线图', 'value': 'line'},
{'label': '柱状图', 'value': 'bar'}
],
value='line'
),
# 根据选择动态渲染图表
dcc.Graph(id='dynamic-plot')
])
@app.callback(
Output('dynamic-plot', 'figure'),
Input('graph-type', 'value')
)
def update_graph(graph_type):
if graph_type == 'line':
return px.line(df, x='x', y='y')
else:
return px.bar(df, x='x', y='y')
高级技巧
实时数据更新
import dash
from dash import dcc, html, Output, Input
import plotly.express as px
import pandas as pd
import random
import time
app = dash.Dash(__name__)
app.layout = html.Div([
dcc.Graph(id='live-update'),
dcc.Interval(
id='interval-component',
interval=1000, # 每秒更新一次
n_intervals=0
)
])
@app.callback(
Output('live-update', 'figure'),
Input('interval-component', 'n_intervals')
)
def update_data(n):
# 模拟实时数据生成
new_df = pd.DataFrame({
'x': list(range(n%5 + 1)),
'y': [random.random() for _ in range(n%5 + 1)]
})
return px.line(new_df, x='x', y='y')
多维数据可视化
fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width',
color='petal_length', size='sepal_length',
hover_data=['species'])
app.layout = html.Div([
dcc.Graph(figure=fig)
])
常见问题
Q: Plotly图表在Dash中无法显示?
A: 检查是否遗漏dcc.Graph组件,或figure对象是否包含有效数据。确保app.layout已正确定义。
Q: 如何调整图表的配色方案?
A: 使用fig.update_traces(marker_color='blue')修改单一图表颜色,或通过fig.update_layout(template='plotly_dark')切换整体主题。
Q: 能否在图表中显示中文标签?
A: 需要设置中文字体路径:
fig.update_layout(
font=dict(
family="Microsoft YaHei",
size=12
)
)
并确保系统已安装对应字体。
总结
通过 Dash 与 Plotly 的无缝集成,开发者可快速构建交互式数据可视化应用,推荐使用 dcc.Graph 组件结合 Plotly Express 实现高效开发。