MATLAB 绘图(一)


概述

MATLAB 经常用于科学研究中的科学计算,因此 MATLAB 也支持完善的绘图功能,本次主要介绍 MATLAB 中的曲线图的绘制。尽管 MATLAB 中的绘图可以用鼠标交互式操作在本次内容中也会开始使用一些相应的绘图函数。本章的内容可以用于绘制论文中一些相关的图。

plot 函数:线性二维曲线图

plot 函数是我们最常使用的函数之一,可以根据传入的点坐标对应描点连线。

一条简单的曲线

传入两个序列:横坐标序列,纵坐标序列(很自然地,横坐标的总数和纵坐标的总数应该一样,这两个序列理应等长)。函数将打开绘图窗口,依次将对应的点以连续的直线连接。

x = -10:0.1:10; 
y = sin(x);
plot(x,y);

上述代码将绘制正弦函数的一部分。


1.png

直线还是曲线?

我们有这样一个疑问:刚才不是说依次将对应的点用直线连接吗?为什么刚才出现的不是折线。这个现象的秘密在于散点的密度:只要点的密度足够到,在视觉效果上就能还原连续平滑的曲线效果。

线由无限的点组成,计算机处理的点的数量却是有限的,因此 plot 函数做的事是连点成线,只要点足够密集,就可以当作曲线看待,至少绘图效果上没有什么区别。

不妨尝试把点的密度降低,运行以下代码。

x = -10:1:10; 
y = sin(x);
plot(x,y);
2.png

上述代码也绘制正弦函数的一部分,原则上它也是正弦函数(尽管不怎么像)这种现象就是采样点间距过大引起的图形失真。因此有一点建议:在算力足够的情况下,可以适当提高绘图的精度达到比较好的视觉效果

用 plot 绘制多条曲线

在已经掌握了使用 MATLAB 绘制一条曲线的方法之后,正准备用于研究函数曲线的伸缩变换,希望有一种方法可以一次性绘制多条曲线。不妨看一下 plot 函数的帮助信息,直接依次传入对应的横纵坐标即可(x1,y1,x2,y2,x3,y3, ...),同时系统还会自动使用不同的颜色绘制不同的曲线。

x1 = -10:0.1:10; 
y1 = sin(x1);
x2 = -5:0.05:5;
y2 = sin(2*x2);
x3 = -10:0.1:10;
y3 = 2*sin(x3);
plot(x1,y1,x2,y2,x3,y3);
% plot(x1,y1);plot(x2,y2);plot(x3,y3);
% 你可能会好奇被注释的三条命令能否实现同样的效果
% 答案是做不到,绘图结果永远只有最后一个曲线。
% 你可以使用稍后提到的 hold on 命令来实现。
3.png

额,看起来这个显示效果有点差。虽说不同曲线的颜色不同,但是即使你能勉强分辨出三条线的轨迹,也看不出哪条曲线对应哪个函数。更重要的是这样:

你查看了打印版的绘图结果,不同颜色的曲线经过黑白打印后几乎没有区别。这时,你迫切需要一个额外的区分曲线的方法。

plot 参数:线型,颜色和标记

为了区分不同的曲线,MATLAB 提供三种参数:为曲线指定不同的线型,颜色和标记。

指定这三种信息的跟随在对应的横坐标和纵坐标之后,以字符串形式传入(也就是使用单引号包含)

x1 = -10:0.1:10; 
y1 = sin(x1);
x2 = -5:0.05:5;
y2 = sin(2*x2);
x3 = -10:0.1:10;
y3 = 2*sin(x3);
plot(x1,y1,'r.-',x2,y2,'go',x3,y3,'b*--');
% 函数一:颜色为红色(r),标记为实心圆点(.),线型为实线(-);
% 函数二:颜色为绿色(g),标记为空心圆点(o),线型为无线
%(尽管默认使用实线,使用标记而不指定线型时为无线);
% 函数三:颜色为蓝色(b),标记为星号(*),线型为虚线(--);
4.png

请不要刻意记住以下这几个表格,与其花时间记住,还不如直接使用 help plot 命令查看帮助来得更快。

线型 说明
- 实线(默认)
-- 虚线
: 点线
-. 点划线
(none) 无曲线
标记 说明
o 圆圈
+ 加号
* 星号
.
x 叉号
s 方形
d 菱形
^ 上三角
v 下三角
> 右三角
< 左三角
p 五角形
h 六角形
颜色 说明
y 黄色
m 品红色
c 青蓝色
r 红色
g 绿色
b 蓝色
w 白色
k 黑色

现在的视觉效果挺不错的,但是你仍然会注意到这个图的一个致命缺陷——没有绘图描述。

绘图窗口的控制命令

使用 figure 命令

打开新的一个绘图窗口(指示当前时刻应当执行绘制曲线的窗口)。

用法:在 plot 命令之前使用 plot 命令。

x1 = -10:0.1:10; 
y1 = sin(x1);
x2 = -5:0.05:5;
y2 = sin(2*x2);
x3 = -10:0.1:10;
y3 = 2*sin(x3);
figure(1); % 指定窗口一用于绘图
plot(x1,y1,'r.-'); 
figure(2); % 指定窗口二用于绘图
plot(x2,y2,'go'); 
figure(); % 指定一个新窗口用于绘图 
figure; % 等同于 figure();
plot(x3,y3,'b*--'); 
figure(1); % 重新指定窗口一用于绘图
plot(x2,y2,'go'); % 曲线一除去,绘制曲线二

使用 legend 命令

允许用字符串来对曲线进行注解。

用法:在 plot 命令之后加上 legend 命令。

x1 = -10:0.1:10; 
y1 = sin(x1);
x2 = -5:0.05:5;
y2 = sin(2*x2);
x3 = -10:0.1:10;
y3 = 2*sin(x3);
plot(x1,y1,'r.-',x2,y2,'go',x3,y3,'b*--');
legend('函数一','函数二','函数三');
5.png

相比之前的绘图结果,legend 命令的作用就是将曲线的注释在绘图窗口标记出来,这回就可以根据注释找到对应的曲线了。

使用 title 命令

嗯,这时正弦函数的变换关系就确定了。为了应用到论文中取,这个图还需要一个标题(title)。在 plot 命令之后加上 title 命令。

x1 = -10:0.1:10; 
y1 = sin(x1);
x2 = -5:0.05:5;
y2 = sin(2*x2);
x3 = -10:0.1:10;
y3 = 2*sin(x3);
plot(x1,y1,'r.-',x2,y2,'go',x3,y3,'b*--');
legend('函数一','函数二','函数三');
title('正弦函数伸缩变换关系图');
6.png

使用 label 命令

label 命令指的是 xlabel 和 ylabel 两个命令。其作用就是在坐标轴上加上想要的字符串描述。

x1 = -10:0.1:10; 
y1 = sin(x1);
x2 = -5:0.05:5;
y2 = sin(2*x2);
x3 = -10:0.1:10;
y3 = 2*sin(x3);
plot(x1,y1,'r.-',x2,y2,'go',x3,y3,'b*--');
legend('函数一','函数二','函数三');
title('正弦函数伸缩变换关系图');
xlabel('自变量');
ylabel('因变量');
7.png

看上去效果不错,这个图已经有了基本的可视化效果。

其他控制命令

为了实现更好的视觉效果,还有一些“无关紧要”的命令可以用来控制绘图窗口。

  • grid on 命令可以在图中加上刻度网格。
  • grid off 命令可以取消 grid on 命令的效果。
  • hold on 命令可以让绘图窗口中的曲线保留,从而实现一个绘图窗口绘制多个曲线。
  • hold off 命令可以取消 hold on 的效果。
  • axis([xmin xmax ymin ymax]) 用于限制两个坐标轴的范围也就是绘图范围。

拓展绘图控制命令(了解即可)

这一部分只是为了告诉你曲线的线宽,标记的大小,颜色都可以通过特定的命令来控制。使用时在搜索引擎中搜索即可。

x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));

figure
p = plot(x,y,'--gs',...
    'LineWidth',2,...
    'MarkerSize',10,...
    'MarkerEdgeColor','b',...
    'MarkerFaceColor',[0.5,0.5,0.5]);
p.LineWidth = 5;
p.Marker = '*';
8.png

甚至更完全的控制命令可以使用 set 命令,但这不属于应当熟练掌握的范围,这里就不多赘述。

对数(非线性)绘图函数

使用 plot 函数可以将图像画在一个 XY 平面坐标系中,美中不足的是:往往数据点分布的不均匀性并不能让我们如愿地绘制足够连续的图案。(如果仍然使用 plot 函数绘制指数分布型的变量,结果将是绝大部分数据点集中于绘图窗口的一侧)

三种非线性绘图函数:

  • semilogx 函数:在 X 轴上使用对数坐标轴绘制曲线;
  • semilogy 函数:在 X 轴上使用对数坐标轴绘制曲线;
  • loglog 函数:在 X 轴和 Y 轴上使用对数坐标轴绘制曲线;

semilogx 函数

x1 = 2.^(0.1:0.2:20); % 自变量呈指数分布
y1 = ones(size(x1));
semilogx(x1,y1,'r.-');
title('x 轴上分布的指数分布型数据变得均匀');
9.png

semilogy 函数

x2 = 0.1:0.2:20;
y2 = exp(x2);  % 因变量呈指数分布
semilogy(x2,y2,'r.-');
title('y 轴上分布的指数分布数据变得均匀');
10.png

loglog 函数

x3 = 2.^(0.1:0.2:20); % 自变量呈指数分布
y3 = 5.^(0.1:0.2:20); % 因变量呈指数分布
loglog(x3,y3,'r.-');
title('xy 两轴上分布的指数分布数据都变得均匀');
11.png

注:以上三个函数的用法无异于 plot 函数,同样可以使用标记、颜色和线型等特性。

plot3 函数:三维曲线图

plot3 函数用于绘制三维曲线图,是 plot 函数的变体。

% plot3 函数仍然沿用 plot3(x,y,z,...)的调用方式
t = 0:pi/50:10*pi;
st = sin(t);
ct = cos(t);
plot3(st,ct,t);
12.png

这里可以看到一条螺旋上升的曲线,也更加印证了 plot 函数是一个遵循描点连线的函数,即使是 plot3 函数也只是绘制三维曲线图 ,而不是三维曲面图。具体的三维曲面图会在下一节中介绍(曲面图参考实例:在命令行输入 peaks )。

小结

plot 函数是本节内容的核心知识,所有内容都从这里展开,也是使用频率最高的绘图。另一方面,尽管 MATLAB 也支持使用鼠标的交互式绘图,读者可以尝试绘图窗口的各个选项。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容