4.1. Plotly 简介#
Plotly 是一个用于创建交互性可视化图表的 Python 库。它支持多种图表类型,包括散点图、线图、条形图、饼图、3D 图等,并且提供了丰富的交互性功能,使用户能够在图表上进行缩放、平移、旋转等操作,也支持悬停显示信息、点击事件等。
它是 Matplotlib 画图库的一个补充,有以下一些区别:
Plotly 生成的图表是交互式的;默认情况下,Matplotlib 生成的图表通常是静态的,缺乏交互性,不如 Plotly 易用和直观。
使用 Matplotlib 需要较多的代码来创建和定制图表,需要显式地指定图表的各个部分,如标题、Axes 等;Plotly 可以用较少的代码生成交互式图表。
Plotly 同时提供一些 Matplotlib 不太容易实现的高级图表类型,如3D图表、地理图表等。
安装库和导入包#
使用 pip
安装:
## 安装包
!pip install plotly kaleido -i https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: plotly in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (5.18.0)
Requirement already satisfied: kaleido in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (0.2.1)
Requirement already satisfied: tenacity>=6.2.0 in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (from plotly) (8.2.3)
Requirement already satisfied: packaging in /Users/luweizheng/miniconda3/envs/pyds/lib/python3.11/site-packages (from plotly) (23.2)
如下所示,导入 Plotly (并导入其他相关库):
import plotly.graph_objects as go
import pandas as pd
import plotly.io as pio
pio.renderers.default = "notebook"
plotly.graph_object
模块包含了用于创建图表的类和方法,使用 import plotly.graph_objects as go
的别名后,可以使用更简洁的缩写 go
来调用这些类和方法,使得代码更为简洁。
plotly.express
是一种更高级的 API 接口,使用了一些默认设置,用户通常需要更少的代码就可以完成很多工作:因为 plotly.express
很多配置都是隐式的,适用于快速创建简单图表,而 plotly.graph_objects
更适合需要更多控制和自定义的情况。
常用绘图步骤#
Plotly 的绘图通常遵循一定的步骤和格式。以下是一个简单的示例,展示了创建一个基本折线图的流程:
创建 Figure
对象#
类似于 Matplotlib,首先需要 创建一个 Figure
对象:go.Figure()
。Figure
是 Plotly 绘图的基础,后续将在 Figure
内写入数据,调整样式。下面的代码创建了一个 Figure
对象,没有加任何数据,是一个空白的图表。
fig = go.Figure()
fig
添加轨迹 trace
#
在 Plotly 中,trace
是一个基本的绘图元素,用于描述图表中的数据和其样式。
使用 .add_trace()
方法向 Figure
对象添加具体的图表,比如散点图、折线图等(可以在一张图上添加多个)。
go.Scatter()
表示作散点图或折线图。x=x_data
指定了 x 轴数据;y=y_data
指定了 y 轴数据;mode='lines+markers'
设置了 trace
的模式,这里设置为 lines+markers
,表示想要在图表上同时显示线和标记;name='My Line'
为这条 trace
分配一个名称。当在一个图表中有多个 trace
(即多组数据多组图表)时,name
参数方便作出图例。
x_data = [1, 2, 3, 4]
y_data = [10, 11, 12, 13]
fig.add_trace(go.Scatter(x=x_data, y=y_data, mode='lines+markers', name='My Line'))
更新布局信息#
使用 .update_layout()
方法更新图表的布局信息,包括标题、坐标轴标签等。
fig.update_layout(title='My Plot', xaxis_title='X-Axis', yaxis_title='Y-Axis')
输出图片#
用 .show()
展示图片后,右上角可以选择放大缩小、保存图片等,图片中可以查看具体点位。
fig.show()
金融数据可视化案例#
下面是一个金融时间序列数据可视化案例:
# 模拟生成金融时间序列数据
date_rng = pd.date_range(start='2022-01-01', end='2022-12-31', freq='B')
data = pd.DataFrame(date_rng, columns=['date'])
data['price'] = 100 + (pd.Series(range(len(date_rng))) + pd.Series(range(len(date_rng))) * 0.1).cumsum()
data['returns'] = data['price'].pct_change()
# 创建 Figure
fig = go.Figure()
# 基础绘图 - 价格走势
fig.add_trace(go.Scatter(x=data['date'], y=data['price'], mode='lines', name='Price'))
# 交互性 - 添加悬停信息
fig.update_traces(hoverinfo='x+y', line=dict(width=2))
# 添加布局信息
fig.update_layout(
title='金融数据可视化',
xaxis_title='日期',
yaxis_title='价格',
)
# 显示图表
fig.show()