作为嵌入式程序员,绘制图像可不是我擅长的,一般我都交给同事
moboyou 2025-05-08 13:39 10 浏览
虽说已经写了不少代码,但作为嵌入式领域的工作者,倒是挺少编写带界面的程序,即使开发带交互功能的程序,通常也是在 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等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
未经许可,禁止转载。
相关推荐
- 声学EI要完稿?十步速写法
-
【推荐会议】国际声学与振动会议(ICAV)会议号:CFP23112A截稿时间:2025年4月20日召开时间/地点:2025年8月15-17日·新加坡论文集上线:会后3个月提交EiComp...
- 结构力学!EI会议图表规范秘籍
-
推荐会议:国际结构与材料工程进展大会(ISME2026)会议编号:EI#73521截稿时间:2026年3月10日召开时间/地点:2026年8月15-17日·德国柏林论文集上线:会后4...
- 傅里叶级数物理意义的直观理解:利用傅里叶级数逼近方波信号
-
上篇文章将向大家介绍频谱的概念,对傅里叶级数、傅里叶积分、傅里叶变换进行了数学的推导,并解释了它们各自的物理意义。推导过程见我的上一篇文章:频谱分析——频谱概念(傅里叶变换、级数、积分及物理意义)如下...
- 通过对航空发动机整机振动进行分析,有何控制方法?
-
前言针对航空发动机整机振动问题的复杂性和多样性,以整机振动的振源分析为出发点,总结国内外关于转子系统故障、气流激振、轴承故障、齿轮故障和结构局部共振等引起的整机振动的研究情况。结合航空发动机整机结构动...
- MATLIB中使用PCA
-
主成分分析PCA(PrincipalComponentsAnalysis),奇异值分解SVD(Singularvaluedecomposition)是两种常用的降维方法降维致力于解决三类问题:降维...
- 数据处理|软件:让科研更简单2
-
书接上回,继续介绍免费的数据处理软件。eGPS一款热图绘制专用软件,热图就是用颜色代表数字,让数据呈现更直观,对比更明显。优点:小巧方便,基本功能齐全,包括数据转换、聚类分析、颜色调整等等缺点:常见的...
- 电力系统常用的通讯协议及其在Speedgoat系统中的实现
-
在电力系统中,IEC61850协议、DNP3协议、ModbusTCP广泛应用于远程终端设备(RTU)、智能电子设备(IED)交互以及监控和数据采集(SCADA)系统。一、IEC61850协议IE...
- 电子工程师的常用仿真软件
-
不知道从事电子行业的工程师,有没有使用模拟仿真工具,仿真软件网上又有很多,初学者,可能只知道Multisim和Proteus。一般Multisim适合在学习模拟电路和电路分析原理课程时使用,便于理解电...
- 技术论文|异结构混沌系统的组合同步控制及电路实现
-
欢迎引用[1]李贤丽,马赛,樊争先,王壮,马文峥,于婷婷.异结构混沌系统的组合同步控制及电路实现[J].自动化与仪器仪表,2022,No.276(10):80-84.DOI:10.14016/j.cn...
- 现场︱某110KV主变事故过程仿真分析
-
三峡电力职业学院、河南省电力公司洛阳供电公司的研究人员李莉、任幼逢、徐金雄、王磊,在2016年第6期《电气技术》杂志上撰文,针对某110KV变电站主变差动保护跳闸事故,结合事故相关检测数据,通过MAT...
- 光伏发电系统篇:单级式并网系统实时仿真
-
在全球积极推动清洁能源转型的大背景下,光伏发电作为重要的可再生能源利用方式,得到了广泛关注和迅猛发展。目前常用的光伏并网及光伏电站主要拓扑结构有单级式和双级式。相较于传统的多级式系统,单级式光伏发电并...
- 光伏发电系统篇:三电平并网逆变器实时仿真
-
一、三电平并网逆变器在能源转型加速的当下,分布式能源接入电网需求大增。三电平并网逆变器凭借低谐波、高功率密度等优势,有效提升电能转换效率,于新能源并网发电中担当关键角色。常见的三电平电路拓扑结构包括二...
- 自制3.5KW大功率逆变器,很简单,看过这个电路原理就懂了
-
前言拿下8000元奖金的项目,是什么水平?本项目经过联合湖南科技大学光伏逆变以及电力电子研究生团队共同探讨方案。项目成本:1200元,获得奖金:8000元!参加赛事:立创开源硬件平台_星火计划·外包赛...
- 圈内分享:电容式加速度计接口电路非线性建模与仿真设计
-
摘要:非线性是Sigma-Delta(ΣΔ)加速度计系统的关键指标之一。基于一个五阶ΣΔ加速度计结构,分析了其主要的非线性模块,在MATLAB中建立了整体结构的行为级模型,并利用根轨迹法进行了稳...
- 基于Matlab/Simulink建立一种Thevenin/RC电池模块仿真模型
-
本文以锂电池数学模型为基础,在Matlab/Simulink的仿真系统中,建立了一种Thevenin/RC电池模块仿真模型,通过实际工况试验,测试精度在允许误差范围内,为电池SOC/SOH研究提供了极...
- 一周热门
- 最近发表
- 标签列表
-
- curseforge官网网址 (16)
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle 数据导出导入 (16)
- oracle两个表 (20)
- oracle 数据库 使用 (12)
- 启动oracle的监听服务 (13)
- oracle 数据库 字符集 (20)
- powerdesigner oracle (13)
- oracle修改端口 (15)
- 左连接 oracle (15)
- oracle 标准版 (13)
- oracle 转义字符 (14)
- asp 连接 oracle (12)
- oracle安装补丁 (19)
- matlab三维图 (12)
- matlab归一化 (16)
- matlab求解方程 (13)
- matlab坐标轴刻度设置 (12)
- matlab脚本 (14)
- matlab多项式拟合 (13)
- matlab阶跃函数 (14)