跳至主要內容

可视化

Akkiri...大约 7 分钟数据分析机器学习PythonPython

一张图的组成

Anatomy of a figure

如图上图所示,一幅图的基本构成部分包括以下几个部分:

  • 图像区域 (Figure):整个绘图区域的边界框,可以包含一个或多个子图。

  • 子图区域 (Axes):实际绘图区域,包含坐标轴、绘制的图像和文本标签等。

  • 坐标轴 (Axis):显示子图数据范围并提供刻度标记和标签的对象。

  • 脊柱 (Spine):连接坐标轴和图像区域的线条,通常包括上下左右四条。

  • 标题 (Title):描述整个图像内容的文本标签,通常位于图像的中心位置或上方,用于简要概 括图像的主题或内容。

  • 刻度 (Tick):刻度标记,表示坐标轴上的数据值。

  • 标签 (Label):用于描述坐标轴或图像的文本标签。

  • 图例 (Legend):标识不同数据系列的图例,通常用于区分不同数据系列或数据类型。

  • 艺术家 (Artist):在 Matplotlib 中,所有绘图元素都被视为艺术家对象,包括图像区域、子图 区域、坐标轴、刻度、标签、图例等等。

可视化工具

上图是用 Matplotlib 库绘制。Matplotlib 是 Python 中最基础的绘图工具。其它常用的绘图库包括:Matplotlib、Seaborn、Plotly。

Matplotlib 可能是 Python 中最常用的绘图库,Matplotlib 具有丰富的绘图功能和灵活的使用方式。Matplotlib 可以绘制多种类型的图形,包括折线图、散点图、柱状图、饼图、等高线图等各种二维、三维图像,还可以进行图像处理和动画制作等。

Seaborn 是基于 Matplotlib 的高级绘图库,专注于统计数据可视化。它提供了多种高级数据可视化技术,包括分类散点图、热图 (热力图)、箱线图、分布图等,可以快速生成高质量的统计图表。Seaborn 适用于数据分析、数据挖掘和机器学习等领域。

注意

Matplotlib 和 Seaborn 生成的都是静态图,即图片。

Plotly 是一个交互式可视化库,可以生成高质量的静态和动态图表。它提供了丰富的图形类型和交互式控件,可以通过滑块、下拉列表、按钮等方式动态控制图形的显示内容和样式。Plotly 适用于 Web 应用、数据仪表盘和数据科学教育等领域。类似 Plotly 的 Python 库还有 Bokeh、Altair、Pygal 等。

使用 Matplotlib 绘制线图

下面将介绍如何用 Matplotlib 可视化正弦、余弦函数

# 导入包
import numpy as np
import matplotlib.pyplot as plt

# 生成横轴数据
x_array = np.linspace(0, 2*np.pi, 100)
# 正弦函数数据
sin_y = np.sin(x_array)
# 余弦函数数据
cos_y = np.cos(x_array)

# 设置图片大小
fig, ax = plt.subplots(figsize=(8, 6))

# 绘制正弦和余弦曲线
ax.plot(x_array, sin_y, label='sin', color='blue', linewidth=2)
ax.plot(x_array, cos_y, label='cos', color='red', linewidth=2)

# 设置标题、横轴和纵轴标签
ax.set_title('Sine and cosine functions')
ax.set_xlabel('x')
ax.set_ylabel('f(x)')

# 添加图例
ax.legend()

# 设置横轴和纵轴范围
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1.5, 1.5)

# 设置横轴标签和刻度标签
x_ticks = np.arange(0, 2*np.pi+np.pi/2, np.pi/2)
x_ticklabels = [r'$0$', r'$\frac{\pi}{2}$',
                r'$\pi$', r'$\frac{3\pi}{2}$',
                r'$2\pi$']
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_ticklabels)

# 横纵轴采用相同的scale
ax.set_aspect('equal')

# 将图片存成SVG格式
plt.savefig('正弦_余弦函数曲线.svg', format='svg')

# 显示图形
plt.show()

生成的图像如下:

pCsdDsO.md.png

提示

大家有时会发现,我们用 Python 代码生成的图像和别人的图像很多细节上并不一致。产生这种偏差的原因有很多。

首先,为了保证矢量图像质量及可编辑性,每幅 Python 代码生成的图形都可能会经过多道后期处理。后期处理的工具包括 (但不限于) Inkscape、MS Visio、Adobe Illustrator。使用怎样的工具要根据图片类型、图片大小等因素考虑。

也就是说哪怕一些简单的线图中的所有元素,都被加工过。比如,图中的数字、英文、希腊字母都是手动添加上去的 (为了保证文本可编辑)。此外,从时间角度来看,一些标注、艺术效果用 Python 写代码方生成并不“划算”。

但是,加工过程仅仅是为了美化图像,并没有篡改数据本身。不篡改数据是一条铁律,希望大家谨记。

Inkscape 是开源免费的矢量图形编辑软件,支持多种矢量图形格式,适用于绘制矢量图形、图标、插图等。MS Visio 特别适合做示意图、流程图等矢量图像。Adobe Illustrator 是 Adobe 公司开发的专业矢量图形编辑软件,功能强大,广泛用于图形设计、插图、标志设计等。此外,也推荐大家使用 CorelDRAW。CorelDRAW 是 Corel 公司开发的矢量图形编辑软件,具有类似于 Adobe Illustrator 的功能,是一种流行的矢量图形处理工具。

产生等差数列

import numpy as np 这句代码的作用是将 NumPy(Python 代码中叫 numpy)导入到当前的 Python 程序 中,并为其取一个简短的别名 np

这意味着我们可以使用 np 代替 numpy 来调用 NumPy 库中的函数和方法,例如 np.linspace()np.sin()np.cos() 等。这样做的好处是可以简化代码,减少输入量,并且提高代码的可读性。

numpy.linspace() 是 NumPy 库中的一个函数,用于生产在给定范围内等差数列。由于在导入 numpy 时,我们将其命名为 np,因此代码中看到的是 np.linspace()

上面的代码中,0 是数值序列的起始值,2*np.pi 是数值序列的结束值,100 是数值序列的数量。因此,x_array = np.linspace(0, 2*np.pi, 100)[0,2π][0, 2\pi] 的闭区间内生成 100 个数值等差数列。

numpy.linspace 函数

numpy.linspace(start, stop, num = 50, endpoint = True)

这个函数的重要输入参数

  • start:起始点的值。
  • stop:结束点的值。
  • num:要生成的数据点的数量,默认为 50。
  • endpoint:布尔值,指定是否包含结束点。如果为 True,则生成的数据点包括结束点;如果为 False,则生成的数据点不包括结束点。

下面是使用例:

import numpy as np

arr = np.linspace(0, 1, num=11)
print(arr)

arr_no_endpoint = np.linspace(0, 1, num=10, endpoint=False)
print(arr_no_endpoint)

正弦、余弦

如下图所示,numpy.sin()numpy.cos() 是 NumPy 库中的数学函数,用于计算给定角度的正弦和余弦值。这两个函数的输入既可以是弧度值(比如 numpy.pi/2),也可以是数组 (一维、二维、多维)。

pC6KDld.md.pngopen in new window
pC6KDld.md.png

提示

NumPy 中,使用 numpy.deg2rad() 将角度转换为弧度,numpy.rad2deg() 将弧度转换为角度。

创建图形,轴对象

fig, ax = plt.subplots(figsize=(8, 6)) 用于创建一个新的 Matplotlib 图形 fig 和一个轴 ax 对象,并设置图形的大小为 (8, 6),单位为英寸。

通过创建图形和轴对象,我们可以在轴上绘制图表、设置轴的标签和标题、调整轴的范围等。fig, ax = plt.subplots() 这一句代码常常是开始绘图的第一步,它创建了一个具有指定大小的图形和轴对象,为后续绘图操作提供了一个可用的基础。

注意

plt 是 Matplotlib 的一个常用的别名,通常通过 import matplotlib.pyplot as plt 引入。所以在使用 plt.subplots() 函数之前,需要确保已经正确导入了 Matplotlib 库。

添加子图

此外,我们还可以使用使用 add_subplot() 方法创建一个新的子图对象,并指定其所在的行、列、编号等属性。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y)
plt.show()

在这个例子中,我们使用 add_subplot() 方法创建了一个新的子图对象,并将其添加到 Figure 对象中。其中,1, 1, 1 参数表示子图在 1 行 1 列的第 1 个位置,即占据整个 Figure 对象的空间。然后,我们在子图中绘制了一个正弦曲线。最后,使用 plt.show() 函数显示 Figure 对象,即可在屏幕上显示绘制的图像。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.5