可视化
一张图的组成
如图上图所示,一幅图的基本构成部分包括以下几个部分:
图像区域 (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()
生成的图像如下:
提示
大家有时会发现,我们用 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)
在 的闭区间内生成 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
),也可以是数组 (一维、二维、多维)。
提示
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 对象,即可在屏幕上显示绘制的图像。