10

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

 3 years ago
source link: https://blog.popkx.com/simple-examples-for-plotting-2d-and-3d-funtion-figure-with-python/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

发表于 2020-02-13 11:02:00   |   已被 访问: 336 次   |   分类于:   Python   |   暂无评论

虽说已经写了不少代码,但作为嵌入式领域的工作者,倒是挺少编写带界面的程序,即使开发带交互功能的程序,通常也是在 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 散点图

上面的例子绘制了面图,当然了,我们也可以绘制 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 散点图

绘制 3D 散点图

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

阅读更多:   Python


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK