互联网技术 / 互联网资讯 · 2023年11月16日 0

数据可视化教程

数据可视化教程

01 导入 Matplotlib

如果你已经安装了完整的 Python Anaconda,那么 Matplotlib 也随之安装完成,你可以直接开始使用。如果没有,请访问官网以获取相关安装指引。

类似于我们用缩写 np 来表示 NumPy,我们也会用标准缩写来导入 Matplotlib:

import Matplotlib as mpl
import Matplotlib.pyplot as plt

其中 plt 是我们最常用的接口。

02 生成一个简单的图形

接下来,我们将创建第一个图形。

假设我们要绘制正弦函数 sin(x) 的简单线图,并希望在 x 轴(0≤x≤10)上获得所有的值。我们将利用 NumPy 的 linspace 函数在 x 轴上创建一个线性空间,x 值从 0 到 10,共 100 个样本点:

import numpy as np
x = np.linspace(0, 10, 100)

接着,我们可以使用 NumPy 的 sin 函数计算 sin 函数的所有 x 值,并通过 plt 的 plot 函数可视化结果:

plt.plot(x, np.sin(x))

你试过了吗?结果如何?有什么发现吗?

不过,显示的结果可能取决于你运行脚本的环境,以下是一些可能的情况:

1. 从 .py 脚本绘图

如果你是在一个脚本中运行 Matplotlib,只需调用 plt,如下所示:

plt.show()

调用后,图形将会显示出来!

2. 从 IPython Shell 绘图

这一方式是以交互方式运行 Matplotlib 的便捷选择。要显示绘图,需要在启动 IPython 后调用 %matplotlib 魔术命令:

%matplotlib inline

然后,所有图形都会自动显示,无需每次调用 plt.show()。

3. 从 Jupyter Notebook 绘图

如果你在浏览器的 Jupyter Notebook 上查看这段代码,同样需要使用 %matplotlib 魔术命令。此外,你还可以选择将图形直接嵌入 Notebook,这有两种方式:

%matplotlib notebook 将生成的交互式图嵌入 Notebook 中。 %matplotlib inline 将生成的静态图嵌入 Notebook 中。

通常我们选择内联选项:

%matplotlib inline

现在再试一次:

plt.plot(x, np.sin(x))

上述命令的输出如图 2-4 所示。

数据可视化教程

▲图 2-4 应用内联选项生成的图

如果你想保存图表,可以直接从 IPython 或 Jupyter Notebook 的选项中进行保存:

plt.savefig(‘figures/02.03-sine.png’)

只需确保使用支持的文件后缀,例如 .jpg、.png、.tif、.svg、.eps 或 .pdf。

在导入 Matplotlib 后,可以通过运行 plt.style.use(style_name) 来更改绘图样式。所有可用样式列在 plt.style.available 中。例如,可以尝试 plt.style.use(‘fivethirtyeight’)、plt.style.use(‘ggplot’) 或 plt.style.use(‘seaborn-dark’)。为了增加乐趣,可以运行 plt.xkcd(),再尝试绘制其他内容。

03 可视化外部数据集的数据

作为最后一个测试,我们将可视化一些来自外部数据集的数据,例如 scikit-learn 的 digits 数据集。

我们将需要三种可视化工具:

用于处理实际数据的 scikit-learn、用于数据处理的 NumPy 以及 Matplotlib。

首先,导入所有这些工具:

import numpy as np
from sklearn import datasets
import Matplotlib.pyplot as plt
%matplotlib inline

接下来,加载数据:

digits = datasets.load_digits()

根据我们的记忆,digits 应该有两个字段:一个是 data 字段,包含实际的图像数据;另一个是 target 字段,包含图像标签。

与其依赖记忆,不如研究一下 digits 对象。通过输入字段名称、添加句点,然后按 Tab 键来实现。这将显示 digits 对象还包含其他字段,例如名为 images 的字段。images 和 data 这两个字段的形状不同:

print(digits.data.shape)
print(digits.images.shape)

输出结果为:

(1797, 64)
(1797, 8, 8)

在这两个例子中,第一维对应于数据集中的图像数。data 将所有像素排列在一个大的向量中,而 images 则保留了每个图像的8×8空间排列。

因此,如果我们想绘制单张图像,images 字段会更合适。首先,使用 NumPy 的数组切片从数据集中抓取一张图像:

img = digits.images[0, :, :]

这里,我们请求抓取长度为 1797 的数组中的第一行,以及所有对应的 8×8=64 个像素。接着,使用 plt 的 imshow 函数绘制图像:

plt.imshow(img, cmap=’gray’)
plt.savefig(‘figures/02.04-digit0.png’)

上述命令的输出如图 2-5 所示。请注意,图像模糊,因为我们将该图像放大至更大的尺寸,而原始图像仅为 8×8。

数据可视化教程

▲图 2-5 生成单张图像的示例结果

此外,我们还可以使用 cmap 参数指定颜色映射。默认情况下,Matplotlib 使用 MATLAB 的默认颜色映射 jet。然而,对于灰度图像,使用 gray 颜色映射更为合适。

最后,我们可以利用 plt 的 subplot 函数绘制一组数字样本。subplot 函数的用法与 MATLAB 相似,我们指定行数、列数以及当前子图的索引(从 1 开始)。我们将用 for 循环遍历数据集中的前 10 个图像,每个图像都有自己的子图:

plt.figure(figsize=(14, 4))
for image_index in range(10):
subplot_index = image_index + 1
plt.subplot(2, 5, subplot_index)
plt.imshow(digits.images[image_index, :, :], cmap=’gray’)

生成的输出如图 2-6 所示。

数据可视化教程

▲图 2-6 生成包含 10 个数字的一组子图