用途
Plotly 是一个 Python 绘图库,用于创建交互式、出版级质量的图表,支持 40 多种图表类型。当需要悬停信息、缩放、平移或可嵌入网页的图表时可以使用它,尤其适合仪表盘、探索性分析和数据可视化场景。
主要能力
图表类型
Plotly 支持 40 多种图表类型,按类别组织:
- 基础图表:散点图、折线图、柱状图、饼图、面积图、气泡图
- 统计图表:直方图、箱线图、小提琴图、分布图、误差条
- 科学图表:热力图、等高线图、三元图、图像显示
- 金融图表:K 线图、OHLC、瀑布图、漏斗图、时间序列
- 地图:散点地图、分级统计图、密度地图(地理可视化)
- 3D 图表:scatter3d、曲面图、网格图、锥体图、体积图
- 专用图表:旭日图、矩形树图、桑基图、平行坐标图、仪表盘
布局与样式
- 子图:使用 make_subplots 创建共享坐标轴的多图布局
- 模板:应用协调一致的样式,内置模板包括 plotly_white、plotly_dark、ggplot2、seaborn、simple_white
- 自定义:控制颜色(离散序列、连续色阶)、字体与文本、坐标轴(范围、刻度、网格)、图例、边距与尺寸、注释与形状
交互性
内置交互功能包括:可自定义数据的悬停提示、平移与缩放、图例切换、框选/套索选择、时间序列的范围滑块、按钮与下拉菜单、动画。
导出选项
- 交互式 HTML:fig.write_html('chart.html') 生成完整独立文件,或使用 include_plotlyjs='cdn' 生成更小的文件
- 静态图片(需安装 kaleido):fig.write_image('chart.png')、fig.write_image('chart.pdf')、fig.write_image('chart.svg')
使用方式
安装
uv pip install plotly
基本用法(Plotly Express 高层 API)
import plotly.express as px import pandas as pd
df = pd.DataFrame({ 'x': [1, 2, 3, 4], 'y': [10, 11, 12, 13] })
fig = px.scatter(df, x='x', y='y', title='My First Plot') fig.show()
在两种 API 之间选择
使用 Plotly Express(px)适用于快速、标准的可视化,具有合理的默认值:处理 pandas DataFrame、创建常见图表类型(散点、折线、柱状、直方图等)、需要自动颜色编码和图例、希望代码量最少(1-5 行)。
使用 Graph Objects(go)适用于精细控制和自定义可视化:Plotly Express 中没有的图表类型(3D 网格、等值面、复杂金融图表)、从头构建复杂的多轨迹图形、需要对单个组件进行精确控制、创建带自定义形状和注释的专用可视化。
注意:Plotly Express 返回的是 graph objects Figure,因此可以组合使用两种方法:
fig = px.scatter(df, x='x', y='y') fig.update_layout(title='Custom Title') # 在 px 图形上使用 go 方法 fig.add_hline(y=10) # 添加形状
子图示例
from plotly.subplots import make_subplots import plotly.graph_objects as go
fig = make_subplots(rows=2, cols=2, subplot_titles=('A', 'B', 'C', 'D')) fig.add_trace(go.Scatter(x=[1, 2], y=[3, 4]), row=1, col=1)
交互性示例
自定义悬停模板
fig.update_traces( hovertemplate='<b>%{x}</b><br>Value: %{y:.2f}<extra></extra>' )
添加范围滑块
fig.update_xaxes(rangeslider_visible=True)
动画
fig = px.scatter(df, x='x', y='y', animation_frame='year')
静态图片导出
uv pip install kaleido
fig.write_image('chart.png') # PNG fig.write_image('chart.pdf') # PDF fig.write_image('chart.svg') # SVG
与 Dash 集成
如需交互式 Web 应用,可使用 Dash(Plotly 的 Web 应用框架):
uv pip install dash
import dash from dash import dcc, html import plotly.express as px
app = dash.Dash(name)
fig = px.scatter(df, x='x', y='y')
app.layout = html.Div([ html.H1('Dashboard'), dcc.Graph(figure=fig) ])
app.run_server(debug=True)
常见工作流
科学数据可视化
import plotly.express as px
带趋势线的散点图
fig = px.scatter(df, x='temperature', y='yield', trendline='ols')
从矩阵生成热力图
fig = px.imshow(correlation_matrix, text_auto=True, color_continuous_scale='RdBu')
3D 曲面图
import plotly.graph_objects as go fig = go.Figure(data=[go.Surface(z=z_data, x=x_data, y=y_data)])
统计分析
分布比较
fig = px.histogram(df, x='values', color='group', marginal='box', nbins=30)
显示所有数据点的箱线图
fig = px.box(df, x='category', y='value', points='all')
小提琴图
fig = px.violin(df, x='group', y='measurement', box=True)
时间序列与金融
带范围滑块的时间序列
fig = px.line(df, x='date', y='price') fig.update_xaxes(rangeslider_visible=True)
K 线图
import plotly.graph_objects as go fig = go.Figure(data=[go.Candlestick( x=df['date'], open=df['open'], high=df['high'], low=df['low'], close=df['close'] )])
多图仪表盘
from plotly.subplots import make_subplots import plotly.graph_objects as go
fig = make_subplots( rows=2, cols=2, subplot_titles=('Scatter', 'Bar', 'Histogram', 'Box'), specs=[[{'type': 'scatter'}, {'type': 'bar'}], [{'type': 'histogram'}, {'type': 'box'}]] )
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1) fig.add_trace(go.Bar(x=['A', 'B'], y=[1, 2]), row=1, col=2) fig.add_trace(go.Histogram(x=data), row=2, col=1) fig.add_trace(go.Box(y=data), row=2, col=2)
fig.update_layout(height=800, showlegend=False)
适用场景
- 需要悬停信息、缩放、平移等交互功能的图表
- 可嵌入网页的图表
- 仪表盘构建
- 探索性数据分析
- 科学数据可视化、统计分析、时间序列与金融图表
- 多图仪表盘布局
- 与 Dash 结合构建交互式 Web 应用
限制
- 静态图片导出(PNG、PDF、SVG)需要额外安装 kaleido
- 资料中未提供关于收费、价格、平台支持范围的具体信息
参考文件
- plotly-express.md - 快速可视化的高层 API
- graph-objects.md - 精细控制的低层 API
- chart-types.md - 40 多种图表类型的完整目录与示例
- layouts-styling.md - 子图、模板、颜色、自定义
- export-interactivity.md - 导出选项与交互功能
附加资源
- 官方文档:https://plotly.com/python/
- API 参考:https://plotly.com/python-api-reference/
- 社区论坛:https://community.plotly.com/