【Python】【数据分析】深入探索 Python 数据可视化:Plotly 绘图库全面解析
这里写目录标题
- 引言
- 一、Plotly 概述
- 二、安装 Plotly
- 三、Plotly 的结构与功能模块
- 3.1 Plotly Graph Objects
- 3.2 Plotly Express
- 3.3 Plotly Subplots
- 四、Plotly 图表类型
- 五、Plotly 图表自定义与美化
- 5.1 自定义图表标题和坐标轴
- 5.2 自定义颜色和样式
- 5.3 添加注释和文本
- 5.4 图表背景和网格线
- 六、Plotly 与 Dash 集成
- 七、高级功能与技巧
- 7.1 动态更新图表
- 7.2 数据筛选和交互
- 7.3 图表导出与分享
- 总结
- 参考文献
引言
在数据科学、分析和机器学习领域,数据可视化是一项至关重要的技能。它不仅帮助我们快速理解数据,还能清晰地传达复杂的信息,从而提升决策效率。在众多 Python 绘图库中,Plotly 以其强大的交互式图表功能脱颖而出,成为数据可视化领域的热门工具。
Plotly 是一个强大的 Python 库,用于创建交互式图表。它支持从简单的折线图到复杂的 3D 图形以及地图的多种图表类型。与传统的静态图表库(如 Matplotlib)不同,Plotly 提供了图形交互性和动态更新功能,极大地增强了数据可视化的效果和用户体验。
本文将详细介绍如何使用 Plotly 创建不同类型的图表,并通过丰富的示例帮助你理解如何将 Plotly 应用于实际项目中。我们将介绍 Plotly 的基础安装、基本图表类型、常见定制方法、与 Dash 的结合使用以及如何将图表导出和分享。整理优化
一、Plotly 概述
Plotly 是一个开源的图表库,提供了交互式的数据可视化功能。它支持多种类型的图表,能够创建非常丰富的图形,包括线图、柱状图、散点图、3D 图、地图等。
Plotly 是一个开源的可视化库,提供了多种丰富的图表类型,包括基本图表(如折线图、条形图、饼图)以及更复杂的图表(如散点图、热图、3D 图、地图)。它的主要特点是图表不仅支持交互式操作,还具备高质量的输出,适合在网页和报告中展示。
Plotly 的主要特点:
- 交互式图表:用户可以通过鼠标缩放、平移、悬停查看数值等交互方式与图表进行操作。
- 广泛的图表类型支持:Plotly 支持折线图、柱状图、饼图、散点图、热图、箱线图等,适用于多种数据展示需求。
- 高度定制化:用户可以控制图表的每一个细节,包含颜色、样式、字体、图例等。
- 导出与集成:图表可以导出为高质量的 PNG、JPEG、SVG 等格式,或者嵌入到 Web 应用中,甚至与 Dash 集成,开发交互式仪表盘。
- 与 Jupyter Notebook 的兼容性:能够与 Jupyter Notebook 集成,支持交互式展示和分析。
二、安装 Plotly
使用 Plotly 之前,首先需要在 Python 环境中安装它。可以使用 pip
包管理工具进行安装:
pip install plotly
安装成功后,可以通过以下代码检查 Plotly 是否正确安装:
import plotly
print(plotly.__version__)
这将输出 Plotly 的版本号,确保库已成功安装。
三、Plotly 的结构与功能模块
Plotly 是一个由多个模块组成的强大工具,每个模块具有不同的功能,适用于不同的使用场景。主要模块包括:
- plotly.graph_objects:底层模块,允许用户手动创建各种图形,并精确控制图表的外观。
- plotly.express:高层接口,简化图表创建流程,适用于快速生成常见类型的图表。
- plotly.subplots:用于创建包含多个子图的布局,便于将多个图表组合在同一页面中。
- plotly.io:用于输入输出操作,例如将图表保存为图像文件或导出为 HTML。
- Dash:基于 Plotly 的 Web 应用框架,用于构建交互式数据仪表盘。
这些模块结合使用,可以帮助用户高效地进行数据可视化和创建交互式应用。
3.1 Plotly Graph Objects
plotly.graph_objs
是一个较低级别的接口,提供更多的灵活性。你可以通过配置图表的每个细节来完全控制图表的样式和外观。
下面是经过更正和补充后的完整示例,确保了格式一致性并修正了重复的标题编号:
- 折线图
在 Plotly 中,创建折线图非常简单。以下是一个基础的折线图的示例:
import plotly.graph_objects as go
# 创建图表对象
fig = go.Figure()
# 添加折线图数据
fig.add_trace(go.Scatter(
x=[1, 2, 3, 4], # X轴数据
y=[10, 11, 12, 13], # Y轴数据
mode='lines+markers', # 显示折线和标记点
name='示例线'
))
# 设置标题和轴标签
fig.update_layout(
title='基础折线图',
xaxis_title='X 轴',
yaxis_title='Y 轴'
)
# 展示图表
fig.show()
解释:
go.Figure()
:用于创建一个空的图表对象。go.Scatter()
:是用来绘制散点图或折线图的函数。mode='lines+markers'
:表示绘制折线并标出每个点。fig.update_layout()
:用于设置图表的标题、坐标轴标签等。
输出图像:
- 条形图
条形图常用于表示不同类别之间的数量比较。以下是创建条形图的代码:
import plotly.graph_objects as go
# 创建条形图
fig = go.Figure(go.Bar(
x=["A", "B", "C", "D"], # 类别
y=[10, 20, 30, 40] # 各类别对应的数值
))
# 设置标题和轴标签
fig.update_layout(
title='条形图示例',
xaxis_title='类别',
yaxis_title='值'
)
# 展示图表
fig.show()
解释:
go.Bar()
:用于创建条形图。x
和y
:定义条形图的分类变量和对应的数值。
输出图像:
- 饼图
饼图适合展示各部分占整体的比例,以下是一个简单的饼图示例:
import plotly.graph_objects as go
# 创建饼图
fig = go.Figure(go.Pie(
labels=["A", "B", "C", "D"], # 标签
values=[10, 20, 30, 40] # 各部分占比
))
# 设置标题
fig.update_layout(
title='饼图示例'
)
# 展示图表
fig.show()
解释:
go.Pie()
:用于创建饼图。labels
和values
:指定饼图的各个部分的标签和对应的值。
输出图像:
- 3D 散点图
3D 散点图用于展示三维数据,适用于具有多个变量的数据集:
import plotly.graph_objects as go
# 创建3D散点图
fig = go.Figure(go.Scatter3d(
x=[1, 2, 3, 4],
y=[10, 11, 12, 13],
z=[100, 200, 300, 400],
mode='markers',
marker=dict(size=12, color='red')
))
# 设置图表标题和轴标签
fig.update_layout(
title='3D 散点图示例',
scene=dict(
xaxis_title='X 轴',
yaxis_title='Y 轴',
zaxis_title='Z 轴'
)
)
# 展示图表
fig.show()
解释:
go.Scatter3d()
:用于创建 3D 散点图。x
,y
,z
:分别代表 3D 散点图的三个坐标轴的数据。mode='markers'
:表示绘制点标记。scene
:用于设置 3D 散点图的坐标轴标签。
输出图像:
3.2 Plotly Express
Plotly Express 是 Plotly 提供的一个高层 API,旨在简化图表的创建过程。它适用于常见的图表类型,用户只需几行代码即可绘制出复杂的图表。
- 快速柱状图
柱状图适合展示不同类别之间的数值比较,以下是一个简单的柱状图示例:
import plotly.graph_objs as go
import plotly.express as px
# 使用 Plotly 提供的 Gapminder 数据集
df = px.data.gapminder()
# 创建柱状图
data = [go.Bar(
x=df[df['continent'] == 'Asia']['country'],
y=df[df['continent'] == 'Asia']['pop']
)]
layout = go.Layout(
title="Population of Asian Countries",
xaxis=dict(title="Country"),
yaxis=dict(title="Population")
)
fig = go.Figure(data=data, layout=layout)
fig.show()
解释:
go.Bar()
:使用go.Bar()
创建柱状图。xaxis
和yaxis
:设置坐标轴标题。go.Layout()
:调整图表的布局和外观。
输出图像:
- 快速折线图
import plotly.express as px
# 使用 Plotly 提供的内置数据集
df = px.data.iris()
# 使用 Plotly Express 创建一个折线图
df = px.data.gapminder() # 从 Plotly 提供的示例数据中获取数据
fig = px.line(df, x="year", y="gdpPercap", color="continent", line_group="country", title="GDP per Capita over Time")
fig.show()
px.line()
:用于创建折线图。这里的数据来源是 gapminder 数据集。color="continent"
:根据不同的大陆设置不同的颜色。
输出图像:
- 快速散点图
import plotly.express as px
# 使用 Plotly 提供的内置数据集
df = px.data.iris()
# 使用 Plotly Express 创建一个散点图
fig = px.scatter(df, x="gdpPercap", y="lifeExp", color="continent", size="pop", hover_name="country", log_x=True, title="GDP vs Life Expectancy")
fig.show()
px.scatter()
:用于创建散点图,展示国家的 GDP 与 寿命 之间的关系。log_x=True
:将 x 轴的标度设置为对数尺度。
输出图像:
3.3 Plotly Subplots
plotly.subplots
可以将多个图表组织在一个布局中。它非常适合展示多维数据,并允许用户在同一界面上展示多个相关的图表。
示例:创建多子图
from plotly.subplots import make_subplots
import plotly.graph_objs as go
# 创建一个 2x2 的子图布局
fig = make_subplots(rows=2, cols=2, subplot_titles=("Scatter Plot", "Bar Chart"))
# 添加子图数据
fig.add_trace(go.Scatter(x=[1, 2, 3, 4],
# 添加第一个子图(左上)
fig.add_trace(go.Scatter(x=[1, 2, 3, 4], y=[10, 11, 12, 13], mode='lines+markers'), row=1, col=1)
# 添加第二个子图(右上)
fig.add_trace(go.Bar(x=["A", "B", "C", "D"], y=[10, 20, 30, 40]), row=1, col=2)
# 添加第三个子图(左下)
fig.add_trace(go.Pie(labels=["A", "B", "C", "D"], values=[10, 20, 30, 40]), row=2, col=1)
# 添加第四个子图(右下)
fig.add_trace(go.Scatter3d(x=[1, 2, 3, 4], y=[10, 11, 12, 13], z=[100, 200, 300, 400], mode='markers'), row=2, col=2)
fig.update_layout(
title_text="Multiple Subplots Example",
title="多个子图示例",
height=600, # 设置图表高度
showlegend=False # 隐藏图例)
fig.show()
解释:
make_subplots(rows=1, cols=2)
:用于创建多个子图,可以设置行数(rows
)和列数(cols
)以及每个子图的位置。fig.add_trace()
:向指定的子图中添加数据。row
和col
:参数指定了每个 trace(数据系列)所在的子图位置。
输出图像:
四、Plotly 图表类型
Plotly 支持多种图表类型,每种类型都有其独特的使用场景。以下是常见的图表类型及其适用场景:
图表类型 | 适用场景 | 示例代码 |
---|---|---|
散点图 (Scatter) | 显示变量之间的关系 | go.Scatter() |
折线图 (Line) | 时间序列数据的趋势展示 | go.Scatter(mode='lines') |
柱状图 (Bar) | 显示类别数据的分布 | go.Bar() |
饼图 (Pie) | 显示组成部分的比例 | go.Pie() |
热图 (Heatmap) | 显示数据的密度分布 | go.Heatmap() |
箱线图 (Box) | 显示数据的分布和离群值 | go.Box() |
3D 散点图 (3D Scatter) | 显示三维数据的关系 | go.Scatter3d() |
五、Plotly 图表自定义与美化
Plotly 提供了强大的自定义功能,允许用户定制图表的布局、样式、颜色、坐标轴等。以下是一些常见的自定义功能:
5.1 自定义图表标题和坐标轴
使用 update_layout()
方法可以修改图表的标题、坐标轴标签等:
fig.update_layout(
title="Customized Plot", # 图表标题
xaxis_title="X Axis Label", # X 轴标题
yaxis_title="Y Axis Label" # Y 轴标题
)
改变坐标轴样式
fig.update_layout(
xaxis=dict(title='自定义 X 轴', tickangle=45), # 自定义 X 轴标题和标签角度
yaxis=dict(title='自定义 Y 轴', gridcolor='lightgray') # 自定义 Y 轴标题和网格线颜色
)
title
:自定义坐标轴标题。tickangle
:调整坐标轴标签的角度。gridcolor
:设置网格线的颜色。
修改颜色和样式
可以通过 update_traces()
方法修改数据点的颜色、大小和边框样式:
fig.update_traces(marker=dict(color='blue', size=10, line=dict(width=2, color='DarkSlateGrey')))
marker
:定制数据点的颜色、大小等样式。line
:控制数据点边框的样式。
5.2 自定义颜色和样式
使用 update_traces()
方法进一步设置图表的颜色、标记样式等:
fig.update_traces(marker=dict(color='rgb(255, 0, 0)', size=12, line=dict(width=2, color='DarkSlateGrey')))
修改图例
fig.update_layout(
showlegend=True, # 显示图例
legend=dict(x=0.5, y=1.15, orientation='h') # 定制图例位置和方向
)
showlegend
:控制是否显示图例。legend
:定制图例的位置 (x
和y
) 和方向 (orientation
),例如h
表示水平排列。
5.3 添加注释和文本
fig.add_annotation(
x=2, y=10,
text="这是一个注释", # 注释文本
showarrow=True, # 显示箭头
arrowhead=7, # 设置箭头的样式
ax=0, ay=-40 # 设置箭头起始位置
)
add_annotation()
:在图表中添加注释或文本,并可定制箭头样式。
5.4 图表背景和网格线
fig.update_layout(
plot_bgcolor='lightyellow', # 设置图表背景颜色
paper_bgcolor='lightgray', # 设置纸张背景颜色
xaxis=dict(showgrid=True, gridcolor='lightblue') # 设置 X 轴网格线颜色
)
plot_bgcolor
:设置图表的背景颜色。paper_bgcolor
:设置图表的纸张背景颜色。showgrid
:控制是否显示网格线,gridcolor
设置网格线的颜色。
通过这些自定义功能,你可以精确控制 Plotly 图表的外观,使其符合特定的设计要求,从而创建更加专业和美观的可视化。
六、Plotly 与 Dash 集成
Dash 是由 Plotly 官方开发的 Web 框架,允许用户通过 Python 创建交互式数据仪表盘,无需深入了解 JavaScript。基于 Flask 和 React.js,Dash 能无缝集成 Plotly 图表,支持快速开发动态 Web 应用。它不仅适用于静态图表展示,还能与 Plotly 配合,打造完整的 Web 数据应用,简化了开发流程,免去对 HTML 和 JavaScript 的依赖。
Dash 示例:创建一个简单的交互式图表
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px
# 初始化 Dash 应用
app = dash.Dash()
# 使用 Plotly 提供的内置数据集
df = px.data.iris()
# 设置应用的布局
app.layout = html.Div([
html.H1("Iris Dataset Visualization"),
dcc.Graph(
id='scatter-plot',
figure=px.scatter(df, x="sepal_width", y="sepal_length", color="species")
)
])
# 运行 Dash 应用
if __name__ == '__main__':
app.run_server(debug=True)
运行此代码后,会在浏览器中启动一个本地 Web 服务器,并显示一个交互式的可视化图表,展示 Iris 数据集的散点图。这里创建了一个简单的 Dash 应用,将一个交互式的散点图嵌入其中。图表会根据
Iris
数据集的sepal_width
和sepal_length
两个变量来展示不同鸢尾花品种的分布。
解释:
html.Div()
是用来创建 HTML 元素的容器,dcc.Graph()
用于显示 Plotly 图表。dash.Dash()
用于创建一个 Dash 应用实例。dcc.Graph(figure=fig)
用于将 Plotly 图表嵌入到 Dash 应用中。html.Div()
用于组织布局的容器。
输出图像:
通过 Dash,你可以轻松地将 Plotly 图表集成到交互式 Web 应用中,支持与用户的交互。
七、高级功能与技巧
7.1 动态更新图表
Plotly 允许图表动态更新,可以在 Web 应用中实时更新图表数据。例如,基于用户输入或定时更新图表内容。下面是一个简单的例子,展示如何根据按钮点击动态更新图表。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import numpy as np
app = dash.Dash()
# 初始数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 布局设置
app.layout = html.Div([
html.Button("Update Graph", id="update-button", n_clicks=0),
dcc.Graph(id="live-graph"),
])
# 动态更新图表
@app.callback(
Output("live-graph", "figure"),
Input("update-button", "n_clicks")
)
def update_graph(n_clicks):
if n_clicks % 2 == 0:
y = np.sin(x)
else:
y = np.cos(x)
return {
'data': [go.Scatter(x=x, y=y, mode='lines')],
'layout': go.Layout(title="Sine and Cosine Waves")
}
if __name__ == '__main__':
app.run_server(debug=True)
解释:
@app.callback()
是 Dash 的回调函数,用于根据组件的输入动态更新图表的输出。在此示例中,点击按钮后图表会在正弦波和余弦波之间切换。
输出图像:
7.2 数据筛选和交互
Plotly 也允许图表与用户的交互进行深度集成,比如根据用户选择的范围动态筛选数据。
例如,可以为图表添加一个滑块,允许用户选择某个数据的范围,并更新图表内容。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.express as px
app = dash.Dash()
# 加载数据
df = px.data.gapminder()
# 布局设置
app.layout = html.Div([
html.H1("Gapminder Data"),
dcc.Graph(id='graph'),
dcc.Slider(
id='year-slider',
min=df['year'].min(),
max=df['year'].max(),
step=5,
marks={year: str(year) for year in range(1950, 2021, 5)},
value=df['year'].max()
)
])
# 回调更新图表
@app.callback(
Output('graph', 'figure'),
Input('year-slider', 'value')
)
def update_graph(selected_year):
filtered_df = df[df['year'] == selected_year]
fig = px.scatter(filtered_df, x="gdpPercap", y="lifeExp", color="continent", size="pop",
hover_name="country", log_x=True, size_max=60, title=f"Year {selected_year}")
return fig
if __name__ == '__main__':
app.run_server(debug=True)
解释:
- 使用
dcc.Slider()
创建了一个滑块组件,用户可以选择不同的年份。 @app.callback()
函数根据用户选择的年份筛选gapminder
数据,并重新生成图表。
输出图像:
7.3 图表导出与分享
Plotly 允许将图表导出为各种高质量的图片或矢量格式(如 PNG、SVG)并在网页中分享。以下是几种常见的导出方法:
- 导出为静态图像
fig.write_image("fig1.png") # 导出为 PNG 格式
fig.write_image("fig1.svg") # 导出为 SVG 格式
- 导出为 HTML 文件
fig.write_html("fig1.html") # 导出为 HTML 文件,可以嵌入网页中
- 直接分享在线图表
Plotly 允许将图表上传到 Plotly 服务器上,以便生成共享链接。你需要在 Plotly 上注册账户,然后使用 plotly.plot
上传图表:
import plotly.plotly as py
py.plot(fig, filename="my-plot")
这样,你将获得一个共享链接,可以直接在浏览器中查看。
总结
通过本文的介绍,我们深入了解了 Plotly 的使用方法、图表类型、数据交互及与 Dash 集成的高级功能。作为一个强大的绘图库,Plotly 不仅能够快速生成美观、互动的图表,还与 Dash 等库无缝集成,提供丰富的交互式可视化功能。无论是简单的统计图表、复杂的 3D 图形,还是交互式地图,Plotly 都能为数据可视化、分析报告以及 Web 应用开发提供完整的解决方案。
参考文献
- Plotly 官方文档
- Dash 官方文档
- Mermaid 官方文档