作为嵌入式程序员,绘制图像可不是我擅长的,一般我都交给同事
bigegpt 2024-12-17 11:23 3 浏览
虽说已经写了不少代码,但作为嵌入式领域的工作者,倒是挺少编写带界面的程序,即使开发带交互功能的程序,通常也是在 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 的散点图,方法是简单的:
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()
执行这段代码,可以得到下面这样的图像:
小结
本节主要介绍了如何使用 Python 的 matplotlib 库绘制简单的 2D 和 3D 图像,当然了,matplotlib 库的功能远不止于此,绘制饼状图、柱状图等其他图表当然不在话下,只不过我对其他图表的绘制没有什么需求,所以这里并未涉及,如果读者感兴趣,当然可以自行研究。另外再说一下,如果希望得到matplotlib 库某个函数的使用说明,通常可以使用 help(function) 查看,如:help(ax.plot_surface)。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
未经许可,禁止转载。
相关推荐
- 了解Linux目录,那你就了解了一半的Linux系统
-
大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...
- Linux命令,这些操作要注意!(linux命令?)
-
刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...
- Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!
-
在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...
- linux必学的60个命令(linux必学的20个命令)
-
以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...
- 15 个实用 Linux 命令(linux命令用法及举例)
-
Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...
- Linux 常用命令集合(linux常用命令全集)
-
系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...
- Linux的常用命令就是记不住,怎么办?
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- Linux常用文件操作命令(linux常用文件操作命令有哪些)
-
ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...
- Linux 常用命令(linux常用命令)
-
日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E...
- 简单粗暴收藏版:Linux常用命令大汇总
-
号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...
- 「Linux」linux常用基本命令(linux常用基本命令和用法)
-
Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...
- Linux的常用命令就是记不住,怎么办?于是推出了这套教程
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- Linux的30个常用命令汇总,运维大神必掌握技能!
-
以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...
- Linux/Unix 系统中非常常用的命令
-
Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)