作为嵌入式程序员,绘制图像可不是我擅长的,一般我都交给同事
moboyou 2025-05-08 13:39 53 浏览
虽说已经写了不少代码,但作为嵌入式领域的工作者,倒是挺少编写带界面的程序,即使开发带交互功能的程序,通常也是在 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等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
未经许可,禁止转载。
相关推荐
- Excel技巧:SHEETSNA函数一键提取所有工作表名称批量生产目录
-
首先介绍一下此函数:SHEETSNAME函数用于获取工作表的名称,有三个可选参数。语法:=SHEETSNAME([参照区域],[结果方向],[工作表范围])(参照区域,可选。给出参照,只返回参照单元格...
- Excel HOUR函数:“小时”提取器_excel+hour函数提取器怎么用
-
一、函数概述HOUR函数是Excel中用于提取时间值小时部分的日期时间函数,返回0(12:00AM)到23(11:00PM)之间的整数。该函数在时间数据分析、考勤统计、日程安排等场景中应用广泛。语...
- Filter+Search信息管理不再难|多条件|模糊查找|Excel函数应用
-
原创版权所有介绍一个信息管理系统,要求可以实现:多条件、模糊查找,手动输入的内容能去空格。先看效果,如下图动画演示这样的一个效果要怎样实现呢?本文所用函数有Filter和Search。先用filter...
- FILTER函数介绍及经典用法12:FILTER+切片器的应用
-
EXCEL函数技巧:FILTER经典用法12。FILTER+切片器制作筛选按钮。FILTER的函数的经典用法12是用FILTER的函数和切片器制作一个筛选按钮。像左边的原始数据,右边想要制作一...
- office办公应用网站推荐_office办公软件大全
-
以下是针对Office办公应用(Word/Excel/PPT等)的免费学习网站推荐,涵盖官方教程、综合平台及垂直领域资源,适合不同学习需求:一、官方权威资源1.微软Office官方培训...
- WPS/Excel职场办公最常用的60个函数大全(含卡片),效率翻倍!
-
办公最常用的60个函数大全:从入门到精通,效率翻倍!在职场中,WPS/Excel几乎是每个人都离不开的工具,而函数则是其灵魂。掌握常用的函数,不仅能大幅提升工作效率,还能让你在数据处理、报表分析、自动...
- 收藏|查找神器Xlookup全集|一篇就够|Excel函数|图解教程
-
原创版权所有全程图解,方便阅读,内容比较多,请先收藏!Xlookup是Vlookup的升级函数,解决了Vlookup的所有缺点,可以完全取代Vlookup,学完本文后你将可以应对所有的查找难题,内容...
- 批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数
-
批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数在电商运营、物流对账等工作中,经常需要统计快递“揽收到签收”的耗时——比如判断某快递公司是否符合“3天内送达”的服务承...
- Excel函数公式教程(490个实例详解)
-
Excel函数公式教程(490个实例详解)管理层的财务人员为什么那么厉害?就是因为他们精通excel技能!财务人员在日常工作中,经常会用到Excel财务函数公式,比如财务报表分析、工资核算、库存管理等...
- Excel(WPS表格)Tocol函数应用技巧案例解读,建议收藏备用!
-
工作中,经常需要从多个单元格区域中提取唯一值,如体育赛事报名信息中提取唯一的参赛者信息等,此时如果复制粘贴然后去重,效率就会很低。如果能合理利用Tocol函数,将会极大地提高工作效率。一、功能及语法结...
- Excel中的SCAN函数公式,把计算过程理清,你就会了
-
Excel新版本里面,除了出现非常好用的xlookup,Filter公式之外,还更新一批自定义函数,可以像写代码一样写公式其中SCAN函数公式,也非常强大,它是一个循环函数,今天来了解这个函数公式的计...
- Excel(WPS表格)中多列去重就用Tocol+Unique组合函数,简单高效
-
在数据的分析和处理中,“去重”一直是绕不开的话题,如果单列去重,可以使用Unique函数完成,如果多列去重,如下图:从数据信息中可以看到,每位参赛者参加了多项运动,如果想知道去重后的参赛者有多少人,该...
- Excel(WPS表格)函数Groupby,聚合统计,快速提高效率!
-
在前期的内容中,我们讲了很多的统计函数,如Sum系列、Average系列、Count系列、Rank系列等等……但如果用一个函数实现类似数据透视表的功能,就必须用Groupby函数,按指定字段进行聚合汇...
- Excel新版本,IFS函数公式,太强大了!
-
我们举一个工作实例,现在需要计算业务员的奖励数据,右边是公司的奖励标准:在新版本的函数公式出来之前,我们需要使用IF函数公式来解决1、IF函数公式IF函数公式由三个参数组成,IF(判断条件,对的时候返...
- Excel不用函数公式数据透视表,1秒完成多列项目汇总统计
-
如何将这里的多组数据进行汇总统计?每组数据当中一列是不同菜品,另一列就是该菜品的销售数量。如何进行汇总统计得到所有的菜品销售数量的求和、技术、平均、最大、最小值等数据?不用函数公式和数据透视表,一秒就...
- 一周热门
- 最近发表
-
- Excel技巧:SHEETSNA函数一键提取所有工作表名称批量生产目录
- Excel HOUR函数:“小时”提取器_excel+hour函数提取器怎么用
- Filter+Search信息管理不再难|多条件|模糊查找|Excel函数应用
- FILTER函数介绍及经典用法12:FILTER+切片器的应用
- office办公应用网站推荐_office办公软件大全
- WPS/Excel职场办公最常用的60个函数大全(含卡片),效率翻倍!
- 收藏|查找神器Xlookup全集|一篇就够|Excel函数|图解教程
- 批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数
- Excel函数公式教程(490个实例详解)
- Excel(WPS表格)Tocol函数应用技巧案例解读,建议收藏备用!
- 标签列表
-
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- css class选择器用法 (25)
- css样式引入 (30)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- php小说爬取源码 (23)
- 云电脑app源码 (22)
- html画折线图 (24)
- docker好玩的应用 (28)
- linux有没有pe工具 (34)
- 可以上传视频的网站源码 (25)
- 随机函数如何生成小数点数字 (31)
- 随机函数excel公式总和不变30个数据随机 (33)
- 所有excel函数公式大全讲解 (22)
- 有动图演示excel函数公式大全讲解 (32)
