MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python使用Plotly进行交互式数据可视化

2022-08-086.4k 阅读

一、Plotly 简介

1.1 什么是 Plotly

Plotly 是一个用于创建交互式可视化的强大工具集,它提供了丰富的图表类型和高度定制的功能。在数据科学和数据分析领域,能够以交互方式展示数据对于深入理解数据特征、发现数据中的模式和关系至关重要。Plotly 支持多种编程语言,包括 Python、R、JavaScript 等,使得不同背景的开发者都能方便地使用它来创建令人印象深刻的数据可视化。

1.2 Plotly 的优势

  1. 交互式特性:与传统的静态图表不同,Plotly 生成的图表可以实现交互操作,例如缩放、平移、悬停查看数据点详细信息等。这种交互性极大地增强了用户与数据之间的互动,帮助用户更全面地探索数据。
  2. 丰富的图表类型:Plotly 支持众多常见和不常见的图表类型,如折线图、柱状图、散点图、饼图、箱线图、地图、3D 图表等。无论你是展示时间序列数据、比较数据分布还是分析地理空间数据,Plotly 都能满足你的需求。
  3. 易于使用和集成:在 Python 中使用 Plotly 非常简单,其 API 设计直观,即使是初学者也能快速上手。同时,它可以很方便地集成到各种数据分析和机器学习项目中,与其他流行的库(如 Pandas、Numpy 等)协同工作。
  4. 高质量输出:Plotly 生成的可视化具有高分辨率和美观的默认样式,并且可以通过大量的参数进行定制,以满足不同项目的风格要求。生成的图表可以导出为多种格式,如 HTML、PDF、PNG 等,方便在不同场景下使用。

二、安装 Plotly

在开始使用 Plotly 进行数据可视化之前,需要先安装相关的库。在 Python 环境中,可以使用 pipconda 进行安装。

2.1 使用 pip 安装

如果你的系统中已经安装了 pip,可以在命令行中运行以下命令来安装 Plotly:

pip install plotly

此外,Plotly 还提供了一个用于离线绘图的扩展库 plotly - offline,它允许在没有网络连接的情况下生成交互式图表。可以使用以下命令安装:

pip install plotly - offline

2.2 使用 conda 安装

如果你使用的是 Anaconda 或 Miniconda 环境,可以通过 conda 进行安装:

conda install -c plotly plotly

同样,对于 plotly - offline,可以使用:

conda install -c plotly plotly - offline

安装完成后,可以在 Python 脚本或交互式环境中导入 Plotly 库来验证安装是否成功:

import plotly
print(plotly.__version__)

三、基本图表绘制

3.1 折线图

折线图是展示时间序列数据或连续数据变化趋势的常用图表类型。下面通过一个简单的示例展示如何使用 Plotly 在 Python 中绘制折线图。

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Sin(x)'))

# 设置图表标题和轴标签
fig.update_layout(title='正弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值')

# 显示图表
fig.show()

在上述代码中:

  1. 首先导入 plotly.graph_objects 模块并将其简称为 go,同时导入 numpy 库用于生成数据。
  2. 使用 np.linspace 生成在 0 到 10 之间均匀分布的 100 个数据点作为 x 轴数据,使用 np.sin 计算对应的 y 轴数据。
  3. 创建一个 Figure 对象 fig,这是 Plotly 中用于管理图表的核心对象。
  4. 通过 fig.add_trace 方法添加一个 Scatter 轨迹,这里设置 mode='lines' 表示绘制折线图,并为轨迹命名。
  5. 使用 fig.update_layout 方法设置图表的标题以及 x 轴和 y 轴的标签。
  6. 最后通过 fig.show() 显示图表。

3.2 柱状图

柱状图适用于比较不同类别之间的数据大小。以下是绘制柱状图的示例代码:

import plotly.graph_objects as go

# 数据
categories = ['A', 'B', 'C', 'D']
values = [25, 40, 15, 30]

# 创建 Figure 对象
fig = go.Figure(data=[go.Bar(x=categories, y=values)])

# 设置图表标题和轴标签
fig.update_layout(title='不同类别的数据比较',
                  xaxis_title='类别',
                  yaxis_title='数值')

# 显示图表
fig.show()

在这个示例中:

  1. 定义了类别列表 categories 和对应的值列表 values
  2. 创建 Figure 对象,并在创建时直接通过 data 参数添加一个 Bar 轨迹,即柱状图。
  3. 使用 update_layout 方法设置图表的标题和轴标签,最后显示图表。

3.3 散点图

散点图常用于展示两个变量之间的关系,以及数据的分布情况。以下是绘制散点图的示例:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.random.randn(100)
y = np.random.randn(100)

# 创建 Figure 对象
fig = go.Figure()

# 添加散点图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='markers', name='随机散点'))

# 设置图表标题和轴标签
fig.update_layout(title='随机散点图',
                  xaxis_title='X 变量',
                  yaxis_title='Y 变量')

# 显示图表
fig.show()

在上述代码中:

  1. 使用 np.random.randn 生成两组服从标准正态分布的随机数据作为 x 轴和 y 轴的数据。
  2. 创建 Figure 对象,并添加一个 Scatter 轨迹,设置 mode='markers' 表示绘制散点图。
  3. 通过 update_layout 设置图表标题和轴标签,最后显示散点图。

四、图表定制

4.1 颜色和样式定制

Plotly 提供了丰富的选项来定制图表的颜色、线条样式、标记样式等。以下以折线图为例展示如何进行定制:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加第一条折线图轨迹,定制颜色和线条样式
fig.add_trace(go.Scatter(x=x, y=y1, mode='lines', name='Sin(x)',
                         line=dict(color='red', width=2, dash='dashdot')))

# 添加第二条折线图轨迹,定制颜色和标记样式
fig.add_trace(go.Scatter(x=x, y=y2, mode='lines+markers', name='Cos(x)',
                         line=dict(color='blue', width=2),
                         marker=dict(size=5, color='green', symbol='square')))

# 设置图表标题和轴标签
fig.update_layout(title='正弦和余弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值')

# 显示图表
fig.show()

在这个示例中:

  1. 生成了正弦和余弦函数的数据。
  2. 为第一条折线 Sin(x) 定制了红色、宽度为 2、虚线点样式的线条。
  3. 为第二条折线 Cos(x) 定制了蓝色、宽度为 2 的线条,并添加了绿色、大小为 5 的正方形标记。

4.2 布局定制

布局定制包括设置图表的背景颜色、字体、边距等。以下是一个示例:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Sin(x)'))

# 布局定制
fig.update_layout(title='正弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值',
                  plot_bgcolor='rgba(240, 240, 240, 1)',
                  paper_bgcolor='rgba(250, 250, 250, 1)',
                  font=dict(family='Arial', size=12, color='black'),
                  margin=dict(l=50, r=50, t=50, b=50))

# 显示图表
fig.show()

在上述代码中:

  1. 使用 plot_bgcolor 设置图表区域的背景颜色为浅灰色。
  2. 使用 paper_bgcolor 设置整个绘图区域(包括图表外的空白部分)的背景颜色为淡白色。
  3. 使用 font 定制字体为 Arial,大小为 12,颜色为黑色。
  4. 使用 margin 设置图表四周的边距。

4.3 多子图布局

有时候需要在一个图表中展示多个子图,以进行数据的对比或关联分析。Plotly 提供了方便的方法来实现多子图布局。以下是一个包含两个子图(折线图和柱状图)的示例:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)

categories = ['A', 'B', 'C', 'D']
y2 = [25, 40, 15, 30]

# 创建 Figure 对象
fig = go.Figure()

# 添加第一个子图(折线图)
fig.add_trace(go.Scatter(x=x, y=y1, mode='lines', name='Sin(x)'), row=1, col=1)

# 添加第二个子图(柱状图)
fig.add_trace(go.Bar(x=categories, y=y2), row=1, col=2)

# 设置子图布局
fig.update_layout(title='多子图示例',
                  grid=dict(rows=1, cols=2, gap=0.2))

# 显示图表
fig.show()

在这个示例中:

  1. 生成了折线图和柱状图所需的数据。
  2. 通过 fig.add_tracerowcol 参数指定每个轨迹所在的子图位置。这里将折线图添加到第一行第一列,柱状图添加到第一行第二列。
  3. 使用 update_layout 中的 grid 参数设置子图的布局,包括行数、列数和子图之间的间距。

五、交互功能

5.1 缩放和平移

Plotly 生成的图表默认支持缩放和平移功能。在图表上,用户可以使用鼠标滚轮进行缩放操作,按住鼠标左键并拖动进行平移操作。例如,在之前绘制的折线图基础上,用户可以轻松地放大某个区域以查看更详细的数据变化。

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Sin(x)'))

# 设置图表标题和轴标签
fig.update_layout(title='正弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值')

# 显示图表
fig.show()

用户在浏览器中打开生成的图表后,即可直接使用缩放和平移功能探索数据。

5.2 悬停查看数据点信息

通过设置,可以在鼠标悬停在数据点上时显示详细的信息。以下以散点图为例展示如何实现:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.random.randn(100)
y = np.random.randn(100)
text = ['点 ' + str(i) for i in range(100)]

# 创建 Figure 对象
fig = go.Figure()

# 添加散点图轨迹,并设置悬停文本
fig.add_trace(go.Scatter(x=x, y=y, mode='markers', name='随机散点',
                         text=text, hoverinfo='text+x+y'))

# 设置图表标题和轴标签
fig.update_layout(title='随机散点图',
                  xaxis_title='X 变量',
                  yaxis_title='Y 变量')

# 显示图表
fig.show()

在上述代码中:

  1. 生成了与散点图数据点对应的文本列表 text
  2. 在添加 Scatter 轨迹时,设置 text 参数为生成的文本列表,并通过 hoverinfo='text+x+y' 表示在悬停时显示文本、x 值和 y 值。

5.3 点击交互

可以为图表添加点击事件的交互功能。例如,当用户点击某个数据点时,可以触发一些操作,如显示额外的信息或改变图表的其他部分。以下是一个简单的示例,当点击散点图的数据点时,在控制台打印出该点的坐标:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.random.randn(100)
y = np.random.randn(100)

# 创建 Figure 对象
fig = go.Figure()

# 添加散点图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='markers', name='随机散点'))

# 定义点击事件处理函数
def on_click(trace, points, state):
    for point in points.point_inds:
        print(f'点击点坐标: x={x[point]}, y={y[point]}')

# 绑定点击事件
fig.data[0].on_click(on_click)

# 显示图表
fig.show()

在这个示例中:

  1. 定义了一个 on_click 函数,该函数接收 trace(触发事件的轨迹)、points(被点击的数据点信息)和 state 参数。
  2. 在函数内部,遍历被点击的数据点索引,并打印出对应的 x 和 y 坐标。
  3. 通过 fig.data[0].on_click(on_click) 将点击事件与 on_click 函数绑定。这里 fig.data[0] 表示图表中的第一个轨迹,因为示例中只有一个散点图轨迹。

六、与其他库结合使用

6.1 与 Pandas 结合

Pandas 是 Python 中常用的数据处理库,与 Plotly 结合可以方便地对数据框中的数据进行可视化。以下是一个使用 Pandas 和 Plotly 绘制柱状图的示例:

import plotly.graph_objects as go
import pandas as pd

# 创建数据框
data = {
    '类别': ['A', 'B', 'C', 'D'],
    '数值': [25, 40, 15, 30]
}
df = pd.DataFrame(data)

# 创建 Figure 对象
fig = go.Figure(data=[go.Bar(x=df['类别'], y=df['数值'])])

# 设置图表标题和轴标签
fig.update_layout(title='不同类别的数据比较',
                  xaxis_title='类别',
                  yaxis_title='数值')

# 显示图表
fig.show()

在这个示例中:

  1. 使用 Pandas 创建了一个数据框 df
  2. 在创建柱状图轨迹时,直接从数据框中获取类别和数值列作为 x 轴和 y 轴的数据。

6.2 与 Numpy 结合

Numpy 主要用于数值计算,在生成复杂的数据用于可视化时经常与 Plotly 结合使用。例如,之前绘制的正弦和余弦函数曲线示例中,就使用了 Numpy 生成数据:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加第一条折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y1, mode='lines', name='Sin(x)'))

# 添加第二条折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y2, mode='lines', name='Cos(x)'))

# 设置图表标题和轴标签
fig.update_layout(title='正弦和余弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值')

# 显示图表
fig.show()

在这个示例中,使用 np.linspace 生成 x 轴数据,使用 np.sinnp.cos 计算对应的 y 轴数据,然后使用 Plotly 绘制折线图。

七、高级图表类型

7.1 箱线图

箱线图用于展示数据的分布情况,包括中位数、四分位数、异常值等信息。以下是绘制箱线图的示例:

import plotly.graph_objects as go
import numpy as np

# 生成多组数据
data1 = np.random.randn(100)
data2 = np.random.randn(100) + 2

# 创建 Figure 对象
fig = go.Figure()

# 添加箱线图轨迹
fig.add_trace(go.Box(y=data1, name='数据集 1'))
fig.add_trace(go.Box(y=data2, name='数据集 2'))

# 设置图表标题和轴标签
fig.update_layout(title='箱线图示例',
                  yaxis_title='数值')

# 显示图表
fig.show()

在上述代码中:

  1. 生成了两组随机数据 data1data2
  2. 通过 fig.add_trace 添加两个 Box 轨迹,即箱线图,并分别命名。
  3. 设置图表标题和 y 轴标签后显示图表。

7.2 饼图

饼图用于展示各部分占总体的比例关系。以下是绘制饼图的示例:

import plotly.graph_objects as go

# 数据
labels = ['苹果', '香蕉', '橙子', '葡萄']
values = [30, 25, 15, 30]

# 创建 Figure 对象
fig = go.Figure(data=[go.Pie(labels=labels, values=values)])

# 设置图表标题
fig.update_layout(title='水果销售比例')

# 显示图表
fig.show()

在这个示例中:

  1. 定义了表示类别(水果名称)的 labels 列表和表示比例值的 values 列表。
  2. 创建 Figure 对象,并添加一个 Pie 轨迹,即饼图。
  3. 设置图表标题后显示饼图。

7.3 3D 图表

Plotly 支持绘制 3D 图表,如 3D 散点图、3D 曲面图等,用于展示三维数据关系。以下是绘制 3D 散点图的示例:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.random.randn(100)
y = np.random.randn(100)
z = np.random.randn(100)

# 创建 Figure 对象
fig = go.Figure()

# 添加 3D 散点图轨迹
fig.add_trace(go.Scatter3d(x=x, y=y, z=z, mode='markers'))

# 设置图表标题和轴标签
fig.update_layout(title='3D 散点图示例',
                  scene=dict(xaxis_title='X 轴',
                             yaxis_title='Y 轴',
                             zaxis_title='Z 轴'))

# 显示图表
fig.show()

在上述代码中:

  1. 生成了三组随机数据作为 x、y、z 轴的数据。
  2. 创建 Figure 对象,并添加一个 Scatter3d 轨迹,即 3D 散点图。
  3. 使用 update_layout 中的 scene 参数设置 3D 场景的轴标签,然后显示图表。

八、图表输出

8.1 输出为 HTML 文件

可以将 Plotly 生成的图表输出为 HTML 文件,方便在网页上展示或分享。以下是将之前绘制的折线图输出为 HTML 文件的示例:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Sin(x)'))

# 设置图表标题和轴标签
fig.update_layout(title='正弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值')

# 输出为 HTML 文件
fig.write_html('sin_curve.html')

在上述代码中,使用 fig.write_html 方法将图表输出为名为 sin_curve.html 的文件。生成的 HTML 文件包含了完整的交互式图表,在浏览器中打开该文件即可查看。

8.2 输出为其他格式

除了 HTML,Plotly 还支持将图表输出为 PDF、PNG 等格式。不过,输出为这些格式需要安装额外的依赖库。例如,输出为 PDF 需要安装 orca 库。以下是输出为 PNG 图片的示例:

import plotly.graph_objects as go
import numpy as np

# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建 Figure 对象
fig = go.Figure()

# 添加折线图轨迹
fig.add_trace(go.Scatter(x=x, y=y, mode='lines', name='Sin(x)'))

# 设置图表标题和轴标签
fig.update_layout(title='正弦函数曲线',
                  xaxis_title='X 值',
                  yaxis_title='Y 值')

# 输出为 PNG 图片
fig.write_image('sin_curve.png')

在上述代码中,使用 fig.write_image 方法将图表输出为名为 sin_curve.png 的图片文件。注意,在运行此代码之前,需要确保已经安装了支持图片输出的相关依赖库。

通过以上内容,你已经全面了解了如何使用 Plotly 在 Python 中进行交互式数据可视化,包括基本图表绘制、图表定制、交互功能实现、与其他库结合使用、高级图表类型以及图表输出等方面。希望这些知识能帮助你在数据分析和展示中创建出更加直观、丰富和交互式的数据可视化作品。