按自变量、因变量值绘图
这是老师教的方法。官方文档
这个方法的实现是:将输入的 n 个点中,相邻两个点都用直线连接。当点足够密时,可以认为曲线是平滑的了。需要散点图在最后加一个参数 .
。
已知表达式
1 | xx = linspace(0, 2*pi, 100); |
参数方程
1 | t = linspace(0,2*pi,100); |
plot 散点图
1 | plot(1:5, 1:5, '.'); % 另可用 `o`, `*` |
按符号函数绘图
fplot 可以直接传函数进去(推荐用符号函数,用匿名函数会警告)。传一个函数即是普通函数,传两个就是参数方程。区间用一个二元向量 [1 2]
表示。
1 | fplot(f) |
ezplot(不知道是什么)
1 | ezplot(sin(x)/x); |
scatter 散点图
后来老师讲了带参数的 plot
,真香。
1 | for i = 1:10 |
使用实心圆可以使用 scatter(i,rand(), 8, 'filled')
。
histogram 直方图
旧版使用 hist
,新版使用 histogram
。
输入一个向量,绘出 x 的每个元素的直方图。
其中,默认把 x 的值分为 10 个区间。
三维线图
plot3
,和 plot
用法类似,给定 n 个点的 (x, y, z) 坐标,plot3
绘制其连起来的线图。
三维面图
surf
三维面图要稍微麻烦一点,需要给定 X, Y, Z 三个矩阵(而不是向量),其中 X, Y 可以用 meshgrid
函数和 x, y 的 n 个坐标进行生成。
下面的代码将生成抛物线 $z=x^2+y^2$ 在 [-5,5] 的范围。
1 | x = -5:0.1:5; |
MATLAB 自带了生成绘制标准球(sphere
)、椭球(ellipsoid
)和标准圆柱侧面(cylinder
)的 X,Y,Z 的函数。
如果想要生成其他大小、位置的球/圆柱,可以考虑坐标变换。下面的代码生成了半径为 R,球心在 [-R, -R, L]
的球。
1 | [x1, y1, z1] = sphere; |
也可以手算得到 X, Y, Z:
1 | close all |
如果给定函数和范围想要直接画出图形,可以改用 fsurf
。
mesh 散点图
动画程序框架
动画框架即是播放一张图片,然后暂停 0.05s。
显然,如果绘图过程耗时远小于 0.05s,则可以做出 20 帧的动画。
1 | close all; |
image 输出图片
1 | background = imread('Snakes_And_Ladder.png'); |
输出了以后还可以用 hold on; plot
在图上绘制几何图形,每个像素为一个单位长度。但需要注意,该图的原点在左上角,x、y 轴的正方向分别为右方、下方。
提示:还可以使用 axis equal off
来保持图片的长宽比,然后隐藏坐标轴。
输出视频
输出视频的原理是将绘图窗口(gcf
为当前绘图窗口)的图片插入视频,最后导出一个 30 帧的视频。
下面用到了类的写法。
1 | mp4 = VideoWriter('highway.mp4','MPEG-4'); |
图的注释、美化
hold on
使用两个 plot
(或其他画图语句)后,第二个会删掉前面的图并且重新画。
要想将两个图叠加在一起,需要在第一次绘图以后加一句 hold on
。如:
1 | plot(...); |
如下次绘图不想叠加了,就在这次绘图之后加一句 hold off
即可。
但请注意,hold on
和 hold off
的原理是设置图/表的 NextPlot
属性为 add
或 replace
,并非立即刷新。在下次绘图时,会检查 NextPlot
的属性,再决定是否覆盖掉,还是将图形进行叠加。
因此,下图的代码中的 hold off
其实无意义。
1 | plot(...); |
另外,很神奇的是,在 MATLAB R2020a 中,rectangle
的语法很诡异。(在 MATLAB R2017a 中没有这个问题)
1 | plot(...); |
多图并排
1 | subplot(1,2,1); |
另外,从 R2019b 开始,您可以使用 tiledlayout
和 nexttile
函数显示平铺绘图。
1 | x = linspace(0,10); |
坐标轴格式调整
1 | axis off % 隐藏坐标轴 |
图的注释
1 | plot(x,y); |
线图的美化
1 | h = plot(x1,y1, 'r-'); % 选择曲线颜色、线型 r 红色,k 黑色,b 蓝色,o |
散点图的美化
1 | plot(d(:,1),y,'o','markersize',12) |