如果你觉得内容对你有帮助,请在 GitHub 上点个 star 吧!

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()