安装和使用Python的matplotlib库绘制2d函数图,3d函数图最简单粗暴的实例

虽说已经写了不少代码,但作为嵌入式领域的工作者,倒是挺少编写带界面的程序,即使开发带交互功能的程序,通常也是在 Linux 命令终端进行的,这主要是因为很多嵌入式程序不是特别需要炫酷的交互界面,因此我会把主要精力放在架构设计与逻辑实现上,界面部分一般则交给同事负责。

不过,不得不承认,如果想说明某个问题,有时候枯燥的几大段文字甚至不如一张简单的图像更有说服力。因此,既然决定写文章,首要目的肯定是让读者读懂我想表达的内容,这时绘制图像就不可少了,考虑C语言和C++绘制图像的不方便,本文将尝试使用 Python,借助 matplotlib 库实现简单的图像绘制,后期如果有需要,文章中的图像都将使用该方法绘制。

安装 matplotlib

因为我常在 Ubuntu 系统中做程序开发,而且我使用的 Ubuntu 系统已经继承了 Python2 和 Python3,因此安装 matplotlib 库是非常方便的,只需要打开终端,执行下面两行命令就可以了:

$ sudo apt install python-pip
$ sudo pip install matplotlib

绘制 2D 函数图

使用 Python 的 matplotlib 库绘制 2D 函数图是非常简单的,下面将给出一段简单的代码示例。首先导入需要用到的库:

import numpy as np
import matplotlib.pyplot as plt

除了用来绘制图像的 matplotlib 库,上述代码还导入了 numpy 库生成模拟数据用于绘制模拟图像:

x = np.linspace(-2, 2, 100)
y = x**2

这段代码将生成两个向量,其中 x 中的数据范围为 -2 ~ 2,一共 100 个数据,y = x2 。现在我们将尝试把这两个数据的关系绘制成图像:

plt.plot(x, y)
plt.show()

运行这段 Python 代码,即可得到相应的函数图像,请看下图:

函数图像

当然了,也可以对图像加一些说明:

plt.plot(x, y, label='y = x^2')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.grid()
plt.legend()
plt.show()

使用这段代码绘制的图像如下图:

添加说明

指定 2D 图像线型

细心的读者应该会发现,我们使用 numpy 库生成的数据都是离散的点,但是上面的代码都是使用实线绘制的。当然了,如果要绘制离散的点,也是简单的,只需要在 plot() 函数里指定线型就可以了,例如可以如下添加代码:

x = np.linspace(-2, 2, 50)
...
plt.plot(x, y, label='y = x^2')
plt.plot(x, y, 'o')
y = 2**x
plt.plot(x, y, label='y = 2^x')
plt.plot(x, y, 'r^')

为了能够看到离散的点,我们还应把 x 的点数目减少,毕竟点密集就逼近直线了,现在将得到下面这样的图像:

多线型绘制图像

绘制多个 2D 图像

实际上,Python 的 matplotlib 库使用起来很像 Matlab 中的 plot 方法,如果希望在一副图像中绘制多个函数图像,也只需增加一个 plot 而已。作为示范,我们将在上面的图像中添加 y = 2x 函数的图像:

plt.plot(x, y, label='y = x^2')
y = 2**x
plt.plot(x, y, label='y = 2^x')
...
plt.show()

多个图像

当然,有时候我们并不希望把两个函数的图像绘制在一个坐标系中,而是希望在一张图片中,同时,但是分开展示它们,此时的代码也是简单的,借助 subplot() 函数即可,它和 Matlab 中的 subplot 方法非常相似,下面是一段简单的示例:

plt.subplot(211)
plt.plot(x, y, label='y = x^2')
plt.plot(x, y, 'o')
plt.legend()
plt.grid()

plt.subplot(212)
y = 2**x
plt.plot(x, y, label='y = 2^x')
plt.plot(x, y, 'r^')
plt.legend()
plt.grid()

plt.subplot(*) 中的参数应该分开看,比如 211 表示将画布分为 2 行 1 列,并且当前的 plt 将在第一份中绘制。212 也是如此,只不过在将在第二份中绘制,上述代码将得到如下图像:

同时,但是分开绘制图像

绘制 3D 图像

同样的,先导入需要用到的库:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

在绘制 3D 图像之前,首先需要生成模拟数据,这里仍然使用 numpy 库,以函数 z = sin(sqrt(x2 + y2) ) 为例:

X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

可能需要说明的是 np.meshgrid() 函数。它是用于生成平面数据的函数,所谓的“平面数据”,在本例中其实就是 3D 图像在 xy 平面的投影。在执行 np.meshgrid() 函数之前,X、Y 仅仅是 1D 的向量,不足以完成 3D 图像的绘制。执行 np.meshgrid() 函数之后,X、Y 就成为 2D 的向量了。读者可以自行做实验加深对该方法的理解,例如:

a = np.array([1,2,3])
b = np.array([7,8])
res = np.meshgrid(a,b)

#返回结果: [array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]

得到模拟数据后,绘制 3D 图像就变得简单了,只需要执行下面的代码:

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.show()

执行这面的 Python 代码,将得到如下图像:

3D 图像的绘制

绘制 3D 散点图

上面的例子绘制了面图,当然了,我们也可以绘制 3D 的散点图,方法是简单的:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.random.randint(0, 255, size=[40, 40, 40])
x, y, z = data[0], data[1], data[2]

我们首先生成了 3 个随机向量 x, y, z,每个向量中 40 个随机数,接着便可在 3D 坐标轴将这些随机数绘制出来:

ax = plt.subplot(111, projection='3d') 
ax.scatter(x[:10], y[:10], z[:10], c='y') 
ax.scatter(x[10:20], y[10:20], z[10:20], c='r')
ax.scatter(x[30:40], y[30:40], z[30:40], c='g')
ax.set_zlabel('Z') 
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.show()

执行这段代码,可以得到下面这样的图像:

绘制 3D 散点图

小结

本节主要介绍了如何使用 Python 的 matplotlib 库绘制简单的 2D 和 3D 图像,当然了,matplotlib 库的功能远不止于此,绘制饼状图、柱状图等其他图表当然不在话下,只不过我对其他图表的绘制没有什么需求,所以这里并未涉及,如果读者感兴趣,当然可以自行研究。另外再说一下,如果希望得到matplotlib 库某个函数的使用说明,通常可以使用 help(function) 查看,如:help(ax.plot_surface)。

阅读更多:   Python
添加新评论