Plotly
是一个功能强大的 Python 库,用于创建交互式、可视化的图表,适用于数据分析、科学计算和仪表板开发。它支持多种图表类型(如折线图、散点图、柱状图、3D 图等),并生成可在浏览器中交互的 HTML 图表。Plotly
的子模块 plotly.express
提供了简洁的高层次 API,适合快速绘图,而 plotly.graph_objects
则提供更精细的控制。Plotly
图表可以导出为静态图像、嵌入 Web 应用,或与 Dash
和 Streamlit
集成。
以下是对 Plotly
库的详细介绍,包括其功能、用法和实际应用。
1. Plotly 库的作用
- 交互式可视化:生成支持缩放、悬停、点击等交互的图表。
- 多平台支持:图表可在 Jupyter Notebook、Web 浏览器、VS Code 中显示。
- 丰富图表类型:支持 2D、3D、地理、统计、财务等多种图表。
- 易于集成:与 Pandas、NumPy、Streamlit、Dash 等库无缝协作。
- 导出与共享:支持导出为 PNG、PDF、HTML,或通过 Plotly Chart Studio 分享。
2. 安装与环境要求
- Python 版本:支持 Python 3.6+(推荐 3.8+)。
- 依赖:
numpy
:数值计算。pandas
:数据处理。tenacity
:重试逻辑。
- 安装命令:
pip install plotly
- Jupyter 支持(可选):
pip install jupyterlab jupyter labextension install jupyterlab-plotly
- 导出静态图像(需安装
kaleido
):pip install kaleido
- 验证安装:
import plotly print(plotly.__version__) # 示例输出: 5.24.1
3. 核心功能与用法
Plotly
提供两个主要接口:plotly.express
(高层次,快速绘图)和 plotly.graph_objects
(低层次,精细控制)。以下是主要功能和示例。
3.1 Plotly Express(快速绘图)
plotly.express
提供简洁的 API,适合快速生成常见图表。
import plotly.express as px
import pandas as pd
# 示例数据
df = pd.DataFrame({
"x": [1, 2, 3, 4],
"y": [10, 15, 13, 17],
"category": ["A", "B", "A", "B"]
})
# 折线图
fig = px.line(df, x="x", y="y", color="category", title="Line Chart")
fig.show()
说明:
px.line
:绘制折线图,color
指定分组。fig.show()
:在浏览器或 Jupyter 中显示交互式图表。
散点图:
fig = px.scatter(df, x="x", y="y", color="category", size="y", title="Scatter Plot")
fig.show()
柱状图:
fig = px.bar(df, x="x", y="y", color="category", title="Bar Chart")
fig.show()
3.2 Graph Objects(精细控制)
plotly.graph_objects
提供更灵活的配置,适合复杂图表。
import plotly.graph_objects as go
# 创建图表
fig = go.Figure()
fig.add_trace(go.Scatter(x=df["x"], y=df["y"], mode="lines+markers", name="Data"))
fig.update_layout(
title="Custom Line Chart",
xaxis_title="X Axis",
yaxis_title="Y Axis",
template="plotly_dark"
)
fig.show()
说明:
go.Scatter
:添加折线/散点轨迹。update_layout
:设置标题、轴标签、主题等。
3.3 3D 图表
支持 3D 散点图、表面图等。
import plotly.express as px
import numpy as np
# 示例数据
z = np.random.rand(10, 10)
fig = px.imshow(z, title="Heatmap")
fig.show()
# 3D 散点图
df = px.data.iris()
fig = px.scatter_3d(df, x="sepal_length", y="sepal_width", z="petal_length", color="species")
fig.show()
说明:
px.imshow
:绘制热图。px.scatter_3d
:绘制 3D 散点图。
3.4 地理图表
支持地图和地理数据可视化。
import plotly.express as px
# 示例数据
df = px.data.gapminder().query("year == 2007")
fig = px.scatter_geo(
df,
locations="iso_alpha",
size="pop",
color="continent",
hover_name="country",
title="World Population"
)
fig.show()
说明:
px.scatter_geo
:绘制全球散点图,locations
使用 ISO 国家代码。
3.5 交互功能
Plotly
图表支持以下交互:
- 缩放:拖动或滚轮调整视图。
- 悬停:显示数据点详情。
- 点击:触发事件(需 JavaScript 或 Dash 集成)。
- 下载:点击图表工具栏的相机图标保存 PNG。
fig = px.line(df, x="x", y="y")
fig.update_traces(hovertemplate="X: %{x}<br>Y: %{y}")
fig.show()
说明:
hovertemplate
:自定义悬停提示。
3.6 导出与保存
将图表保存为文件或嵌入 HTML。
# 保存为 PNG
fig.write_image("chart.png")
# 保存为 HTML
fig.write_html("chart.html")
# 保存为 JSON
fig.write_json("chart.json")
说明:
write_image
需安装kaleido
。write_html
生成独立 HTML 文件,可嵌入网站。
4. 性能与特点
- 高效性:基于 JavaScript 的 WebGL 渲染,适合大数据可视化。
- 交互性:支持动态交互,无需额外配置。
- 跨平台:图表可在本地、云端、Jupyter 中一致显示。
- 局限性:
- 大型数据集(>10万点)可能导致渲染缓慢,需降采样。
- 复杂 3D 图表对浏览器性能要求较高。
- 主题支持:内置主题(如
plotly
、plotly_dark
、seaborn
)。
5. 实际应用场景
- 数据分析:探索性数据分析(EDA),展示趋势和分布。
- 仪表板:与 Streamlit 或 Dash 集成,构建交互式仪表板。
- 科学研究:可视化实验数据(如物理、生物学)。
- 商业报告:生成动态报告,嵌入 PowerPoint 或网页。
- 机器学习:展示模型性能(如 ROC 曲线、混淆矩阵)。
示例(Streamlit 集成):
import streamlit as st
import plotly.express as px
import pandas as pd
st.title("Interactive Plotly Dashboard")
# 数据
df = pd.DataFrame({
"x": range(10),
"y": [2, 4, 1, 5, 3, 6, 2, 7, 4, 8]
})
# 交互控件
chart_type = st.selectbox("Chart Type", ["Line", "Scatter"])
if chart_type == "Line":
fig = px.line(df, x="x", y="y")
else:
fig = px.scatter(df, x="x", y="y")
st.plotly_chart(fig)
说明:
- 用户选择图表类型,动态更新 Plotly 图表。
6. 部署与共享
- 本地运行:
fig.show()
在浏览器显示图表。
- Jupyter Notebook:
import plotly.io as pio pio.renderers.default = "notebook" fig.show()
- Dash 集成:
from dash import Dash, dcc, html app = Dash(__name__) app.layout = html.Div([dcc.Graph(figure=fig)]) app.run_server(debug=True)
- Chart Studio(云共享):
import plotly.io as pio pio.write_to_plotly(fig, filename="my-chart")
- 需注册 Plotly 账户并设置 API 密钥:
import plotly plotly.tools.set_credentials_file(username="your_username", api_key="your_api_key")
- 需注册 Plotly 账户并设置 API 密钥:
7. 注意事项
- 性能:
- 大数据集建议使用
plotly.express
的render_mode="webgl"
:fig = px.scatter(df, x="x", y="y", render_mode="webgl")
- 避免在循环中频繁调用
fig.show()
。
- 大数据集建议使用
- 兼容性:
- 确保
plotly
和可视化库(如pandas
)版本兼容。 - 最新版本(截至 2025,5.24.1)支持更多功能。
- 确保
- 浏览器支持:
- 某些 3D 图表在旧浏览器可能渲染不佳。
- 导出问题:
- 静态图像导出需
kaleido
,可能因字体或系统配置报错。
- 静态图像导出需
- 学习曲线:
plotly.express
简单易学,graph_objects
需熟悉对象结构。
8. 综合示例
以下是一个综合示例,展示多种图表类型和交互功能:
import streamlit as st
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
st.title("Plotly Visualization Dashboard")
# 示例数据
df = px.data.gapminder().query("year == 2007")
# 选择图表类型
chart_type = st.selectbox("Select Chart Type", ["Scatter", "Bar", "Geo"])
if chart_type == "Scatter":
fig = px.scatter(
df,
x="gdpPercap",
y="lifeExp",
size="pop",
color="continent",
hover_name="country",
log_x=True,
title="GDP vs Life Expectancy"
)
elif chart_type == "Bar":
fig = px.bar(
df,
x="continent",
y="pop",
color="continent",
title="Population by Continent"
)
else:
fig = px.scatter_geo(
df,
locations="iso_alpha",
size="pop",
color="continent",
hover_name="country",
title="World Population Map"
)
# 自定义布局
fig.update_layout(
template="plotly_dark",
xaxis_title="X Axis",
yaxis_title="Y Axis"
)
# 显示图表
st.plotly_chart(fig)
# 保存选项
if st.button("Save as PNG"):
fig.write_image("chart.png")
st.write("Chart saved as chart.png")
说明:
- 用户选择图表类型(散点图、柱状图、地理图)。
- 图表使用暗主题,支持悬停和缩放。
- 提供保存为 PNG 的功能。
9. 资源与文档
- 官方文档:https://plotly.com/python/
- GitHub 仓库:https://github.com/plotly/plotly.py
- PyPI 页面:https://pypi.org/project/plotly/
- Plotly Express 教程:https://plotly.com/python/plotly-express/
- Dash 文档:https://dash.plotly.com/
- 社区论坛:https://community.plotly.com/