24、MATLAB绘图全攻略:从基础到应用

MATLAB绘图全攻略:从基础到应用

一、动画绘图与三维绘图

(一)动画绘图

在MATLAB中,有多种方法可以实现动画绘图,其中 comet 函数和 movie 函数是常用的两种。
- comet函数 comet(x, y) 用于绘制动画轨迹,它会先显示点 (x(1), y(1)) ,然后依次移动到 (x(2), y(2)) 等点,就像彗星一样留下之前点的轨迹,最终结果看起来与 plot(x, y) 相同。
- movie函数 :用于显示录制的电影帧。以下是一个绘制正弦函数动画的示例代码:

% Shows a movie of the sin function
clear
x = -2*pi: 1/5 : 2*pi;
y = sin(x);
n = length(x);
for i = 1:n
    plot(x(i),y(i),'r*')
    axis([min(x)-1 max(x)+1 min(y)-1 max(y)+1])
    M(i) = getframe;
end
movie(M)

在这个代码中, getframe 函数用于捕获每一帧的图像,存储在矩阵 M 中,最后使用 movie(M) 播放动画。

(二)三维绘图

MATLAB提供了许多用于显示三维绘图的函数,大多数这些函数的名称是对应的二维绘图函数名称后面加一个 3 。常见的三维绘图函数如下:
| 函数名 | 功能 |
| ---- | ---- |
| plot3 | 三维线图 |
| bar3 | 三维柱状图 |
| pie3 | 三维饼图 |
| stem3 | 三维杆状图 |

以下是使用这些函数的示例代码:

% plot3示例
x = 1:5;
y = [0 -2 4 11 3];
z = 2:2:10;
plot3(x,y,z,'k*')
grid

% bar3示例
x = 1:6;
y = [33 11 5 9 22 30];
bar3(x,y)

% pie3示例
pie3([3 10 5 2])

在使用 plot3 stem3 函数时,需要传入代表 x y z 坐标的向量,这些函数会在三维空间中显示点。用户可以点击 rotate 3D 图标,然后在绘图区域旋转视图,从不同角度查看绘图。使用 grid 函数可以使绘图更易于可视化。

二、自定义绘图

(一)通过Plot Tools和函数参数自定义

在图形窗口中,点击 Plot Tools 图标会弹出 Property Editor Plot Browser ,提供了许多修改当前绘图的选项。此外,绘图函数本身也有一些属性可以从默认值进行修改,使用 help 函数加上函数名可以查看该特定绘图函数的所有选项。

(二)调整柱状图宽度

bar barh 函数为例,默认情况下,它们在柱子之间的宽度为 0.8 。如果传入第三个参数,则该参数表示宽度。以下是一个展示不同宽度柱状图的示例代码:

% Subplot to show varying bar widths
x = 1:6;
y = [33 11 5 9 22 30];
for i = 1:4
    subplot(1,4,i)
    % width will be 0.6, 0.8, 1, 1.2
    barh(x,y,0.4+i*.2)
    title(sprintf('Width = %.1f',0.4+i*.2))
end

当宽度为 0.6 时,柱子之间的空间更多;宽度为 1 时,柱子相互接触;宽度大于 1.2 时,柱子会重叠。

(三)爆炸式饼图

在绘制饼图时,可以将饼图的某些部分“爆炸”出来。此时需要传入两个向量,第一个是数据向量,第二个是逻辑向量,逻辑向量中为 true 的元素对应的部分会从饼图中分离出来。还可以传入第三个参数,即标签的单元格数组。示例代码如下:

vec = [3 10 5 2];
which = (vec == 5);
pie(vec, which, {'A', 'B', 'C', 'D'});

三、图形属性

(一)句柄图形

MATLAB在所有图形中使用句柄图形(Handle Graphics®),每个图形由不同的对象组成,每个对象都被分配一个句柄,这是一个唯一的实数,用于引用该对象。

(二)获取和设置图形属性

绘图函数会返回绘图对象的句柄,可以将其存储在变量中。以下是一个获取和设置正弦函数绘图属性的示例代码:

x = -2*pi: 1/5 : 2*pi;
y = sin(x);
hl = plot(x,y);
% 获取属性
get(hl)
% 获取特定属性(如线宽)
get(hl,'LineWidth')
% 设置属性(如将线宽从默认的0.5改为1.5)
set(hl,'LineWidth',1.5)
% 在原始函数调用中设置属性
hl = plot(x,y, 'Linewidth', 2.5);

需要注意的是,获取绘图后,图形窗口不应关闭,否则对象句柄将无效。

四、绘图应用

(一)从函数绘图

以下是一个名为 plotywithcell 的函数,它可以根据传入的 y 向量和绘图类型的单元格数组,在一个图形窗口中显示不同类型的绘图:

function plotywithcell(y, rca)
% Shows different plot types, passed as a cell array
lenrca = length(rca);
for i = 1:lenrca
    subplot(1,lenrca,i)
    funh = str2func(rca{i});
    funh(y)
    title(upper(rca{i}))
end

使用示例:

y = [1:2:9].^3;
rca = {'bar', 'area', 'plot'};
plotywithcell(y, rca);

(二)从文件绘图

1. 公司销售数据绘图

假设公司有两个部门 A B ,文件 ab06.dat 存储了2006年每个季度两个部门的销售数据。以下是读取数据并绘制柱状图的示例代码:

% Reads sales figures for 2 divisions of a company one
% line at a time as strings, and plots the data
fid = fopen('ab06.dat');
if fid == -1
    disp('File open not successful')
else
    for i = 1:4
        % Every line is of the form A#B#; this separates
        % the characters and converts the #’s to actual
        % numbers
        aline = fgetl(fid);
        aline = aline(2:length(aline));
        [compa rest] = strtok(aline,'B');
        compa = str2num(compa);
        compb = rest(2:length(rest));
        compb = str2num(compb);
        % Data from every line is in a separate subplot
        subplot(1,4,i)
        bar([compa,compb])
        set(gca, 'XtickLabel', {'A', 'B'})
        axis([0 3 0 8])
        ylabel('Sales (millions)')
        title(sprintf('Quarter %d',i))
    end
    closeresult = fclose(fid);
    if closeresult ~= 0
        disp('File close not successful')
    end
end
2. 公司各部门销售数据绘图

文件 compsales.dat 存储了公司各部门的销售数据,每行存储销售数量和部门缩写。以下是读取数据并绘制柱状图和饼图的示例代码:

% Reads sales figures and plots as a bar chart and a pie chart
fid = fopen('compsales.dat');
if fid == -1
    disp('File open not successful')
else
    % Use textscan to read the numbers and division codes
    % into separate elements in a cell array
    filecell = textscan(fid,'%f %s');
    % plot the bar chart with the division codes on the x ticks
    subplot(1,2,1)
    bar(filecell{1})
    xlabel('Division')
    ylabel('Sales (millions)')
    set(gca, 'XtickLabel', filecell{2})
    % plot the pie chart with the division codes as labels
    subplot(1,2,2)
    pie(filecell{1}, filecell{2})
    title('Sales in millions by division')
    closeresult = fclose(fid);
    if closeresult ~= 0
        disp('File close not successful')
    end
end

五、常见陷阱与编程风格指南

(一)常见陷阱

  • 忘记 subplot 函数是按行编号而不是按列编号。
  • 没有意识到 subplot 函数只是在图形窗口中创建一个矩阵,这个矩阵的每个部分都需要使用某种绘图函数来填充绘图。
  • 过早关闭图形窗口,因为只有在图形窗口仍然打开时才能设置属性。

(二)编程风格指南

  • 始终为绘图添加标签,以便更好地理解绘图内容。
  • 注意选择合适的绘图类型,以突出最相关的信息。

六、练习

(一)从文件加载数据绘图

创建一个包含10个数字的数据文件,编写一个脚本从文件中加载向量,并使用 subplot 在同一个图形窗口中进行面积图和杆状图的绘制。提示用户为每个绘图输入标题。

(二)比较正弦和余弦函数

使用 subplot 展示正弦和余弦函数的差异。创建一个包含100个线性间隔点的 x 向量,范围从 –2π ,然后创建两个 y 向量分别表示 sin(x) cos(x) 。在一个2×1的子图中使用 plot 函数显示它们,并添加适当的标题。

(三)胰岛素清除模拟

生物医学工程师正在为糖尿病患者开发胰岛素泵,需要了解餐后胰岛素从体内清除的情况。胰岛素在任何时间 t 的浓度由方程 C = C0 e−30t/m 描述,其中 C0 是胰岛素的初始浓度, t 是时间(分钟), m 是人的体重(千克)。编写一个脚本,以图形方式显示人的体重如何影响胰岛素从体内清除的时间。在一个2×1的子图中显示两个受试者的胰岛素浓度,一个体重120磅,另一个体重300磅。对于两者,时间应从0到4分钟以0.1分钟为步长递增,初始浓度应为85。每个子图应显示随时间变化的浓度,并且标题中应包含人的体重。转换因子为1磅 = 0.4536千克。为了更好地比较,两个绘图应使用一致的坐标轴。

(四)函数绘图

编写一个名为 subfnfn 的函数,它接收两个函数句柄作为输入参数,并在一个图形窗口中显示这两个函数的绘图,标题中包含函数名称。使用默认坐标轴。该函数将创建一个范围从1到 n n 是4到10之间的随机整数)的 x 向量。

(五)读取文件绘制温度图

文件 avehighs.dat 存储了3个地点一年中每个月的平均高温(四舍五入为整数)。编写一个脚本,读取这些数据并在一个图形窗口中分别绘制这三个地点的温度图。必须使用 for 循环来完成这个任务。

(六)公司部门销售数据绘图

公司两个不同部门2006年四个季度的销售数据(以百万为单位)存储在向量变量中。使用 subplot 并排显示两个部门的销售数据。哪种图形最适合显示这些数据?为什么?在一个图形中比较两个部门,哪种图形最适合?为什么?

(七)修改绘图属性

创建一个包含30个线性间隔点的 x 向量,范围从 –2π ,然后计算 y = sin(x) 。对这些点进行杆状图绘制,并将句柄存储在一个变量中。使用 get 查看杆状图的属性,然后使用 set 更改标记的面颜色。

(八)牛顿冷却定律绘图

当一个初始温度为 T 的物体放入温度为 S 的物质中时,根据牛顿冷却定律,在 t 分钟内它将达到温度 Tt = S + (T – S) e(-kt) ,其中 k 是一个取决于物体属性的常数值。对于初始温度为100和 k = 0.6 ,以图形方式显示两种不同周围温度(50和20)下从1到10分钟的最终温度。使用 plot 函数为这两种周围温度绘制两条不同的线,并将句柄存储在一个变量中。注意实际上会返回两个函数句柄,并存储在一个向量中。使用 set 更改其中一条线的线宽。

(九)绘制随机宽度直线

编写一个脚本,在 x = 2 x = 5 之间绘制直线 y = x ,线的厚度为1到10之间的随机值。

(十)水文降雨强度绘图

在水文学中,降雨强度图用于显示风暴期间的降雨强度。强度可以是每小时的降雨量,每小时记录一次,持续24小时。创建自己的数据文件来存储每小时的降雨强度(英寸/小时),使用柱状图显示这些强度。

(十一)从文件读取数据绘制面积图

编写一个脚本,从文件中读取 x y 数据点,并使用这些点创建面积图。文件中每行的格式为字母 x 、一个空格、 x 值、一个空格、字母 y 、一个空格和 y 值。假设数据文件的格式完全如此,但不假设文件中的行数已知。绘图标题中应包含点数。脚本应循环直到文件结束,使用 fgetl 将每行作为字符串读取。

(十二)住房数据绘图

文件 houseafford.dat 在其三行中存储了一个城市的年份、中位数收入和中位数房价(以千为单位)。创建一个这种格式的文件,然后将信息加载到一个矩阵中。创建一个水平堆叠柱状图来显示这些信息,并添加适当的标题。注意:使用 XData 属性将年份显示在坐标轴上。

(十三)住房 affordability 指数绘图

创建一个这种格式的文件,然后将信息加载到一个矩阵中。房价与收入的比率称为住房可承受性指数。计算每年的这个指数并绘制图形。 x 轴应显示年份(例如,2000 - 2007)。将绘图的句柄存储在一个变量中,使用 get 查看属性并使用 set 更改至少一个属性。

(十四)披萨偏好调查绘图

对朋友进行快速调查,了解谁更喜欢奶酪披萨、意大利辣香肠披萨或蘑菇披萨(没有其他可能性,每个人必须选择其中之一)。绘制一个饼图来显示每种偏好的百分比,并为这个披萨饼图的每个部分添加标签。

(十五)工程学院部门人数绘图

某工程学院各部门的教师人数如下:
| 部门 | 人数 |
| ---- | ---- |
| ME | 22 |
| BM | 45 |
| CE | 23 |
| EE | 33 |

尝试至少三种不同的绘图类型来图形化表示这些信息。确保绘图有适当的标题、标签和图例。哪种类型的绘图效果最好?为什么?

(十六)飞机组件重量绘图

飞机设计中,给定飞机主要组件的重量是重要的考虑因素。组件至少包括机翼、尾翼、机身、起落架等。创建一个包含这些重量值的数据文件。从文件中加载数据并创建一个饼图,显示每个组件的百分比重量。

(十七)多向量绘图与图例

创建一个 x 向量,然后基于 x 创建两个不同的向量 y z 。绘制它们并添加图例。使用 help legend 了解如何在图形上定位图例本身,并尝试不同的位置。

(十八)风寒因子绘图

风寒因子(WCF)衡量在给定空气温度 T (华氏度)和风速 V (英里/小时)下感觉有多冷。其公式为 WCF = 35.7 + 0.6T − 35.7 (V0.16) + 0.43T (V0.16) 。尝试不同的绘图类型来显示不同风速和温度下的风寒因子。

(十九)多次绘制正弦函数

编写一个脚本,在一个图形窗口中三次绘制正弦函数,分别使用红色、绿色和蓝色。

(二十)comet函数实验

尝试输入 help comet 时给出的示例,然后使用 comet 函数为自己的函数创建动画。

(二十一)comet3函数实验

尝试输入 help comet3 时给出的示例,然后使用 comet3 函数为自己的函数创建动画。

(二十二)研究scatter和scatter3函数

研究 scatter scatter3 函数的功能和用法。

(二十三)指数和自然对数函数绘图

指数函数和自然对数函数是反函数,这在函数图形方面意味着什么?在一个图形窗口中显示这两个函数,并区分它们。

(二十四)风力发电机发电数据绘图

文件存储了风力发电机每年的发电量(千瓦时/年),发电量取决于涡轮机叶片的直径(英尺)和风速(英里/小时)等因素。文件每行存储叶片直径、风速和一年的近似发电量。创建这个文件,并确定如何以图形方式显示这些数据。

七、深入解析绘图操作流程

(一)动画绘图流程

动画绘图可以让数据动态展示,以 comet movie 函数为例,具体操作流程如下:
1. comet 函数流程
- 定义 x y 向量,用于表示绘图的点。
- 调用 comet(x, y) 函数,它会按顺序显示点并留下轨迹。
mermaid graph LR A[定义x和y向量] --> B[调用comet(x, y)函数]
2. movie 函数流程
- 定义 x y 向量。
- 初始化循环变量 n ,用于控制帧数。
- 在循环中,使用 plot 函数绘制当前点,使用 axis 函数设置坐标轴范围,使用 getframe 函数捕获当前帧并存储在矩阵 M 中。
- 循环结束后,调用 movie(M) 函数播放动画。
mermaid graph LR A[定义x和y向量] --> B[初始化循环变量n] B --> C{循环i = 1到n} C --> D[plot绘制当前点] D --> E[axis设置坐标轴范围] E --> F[getframe捕获当前帧存入M] F --> C C -->|循环结束| G[调用movie(M)播放动画]

(二)三维绘图流程

三维绘图能更直观地展示数据的空间分布,以 plot3 bar3 pie3 函数为例,操作流程如下:
1. plot3 函数流程
- 定义 x y z 向量。
- 调用 plot3(x, y, z, 'k*') 函数绘制三维点,可使用 grid 函数添加网格。
mermaid graph LR A[定义x、y、z向量] --> B[调用plot3(x, y, z, 'k*')] B --> C[调用grid函数添加网格]
2. bar3 函数流程
- 定义 x y 向量。
- 调用 bar3(x, y) 函数绘制三维柱状图。
mermaid graph LR A[定义x和y向量] --> B[调用bar3(x, y)]
3. pie3 函数流程
- 定义数据向量。
- 调用 pie3(数据向量) 函数绘制三维饼图。
mermaid graph LR A[定义数据向量] --> B[调用pie3(数据向量)]

(三)自定义绘图流程

自定义绘图可以让图形更符合需求,以调整柱状图宽度和绘制爆炸式饼图为例,操作流程如下:
1. 调整柱状图宽度流程
- 定义 x y 向量。
- 使用 for 循环,在每次循环中使用 subplot 函数创建子图,调用 barh(x, y, 宽度) 函数绘制柱状图,并使用 title 函数添加标题。
mermaid graph LR A[定义x和y向量] --> B[初始化循环变量i = 1到4] B --> C{循环i = 1到4} C --> D[subplot创建子图] D --> E[barh绘制柱状图] E --> F[title添加标题] F --> C
2. 绘制爆炸式饼图流程
- 定义数据向量 vec
- 定义逻辑向量 which ,用于指定哪些部分要爆炸。
- 定义标签单元格数组。
- 调用 pie(vec, which, 标签单元格数组) 函数绘制爆炸式饼图。
mermaid graph LR A[定义数据向量vec] --> B[定义逻辑向量which] B --> C[定义标签单元格数组] C --> D[调用pie(vec, which, 标签单元格数组)]

(四)图形属性操作流程

图形属性操作可以改变图形的外观,以获取和设置属性为例,操作流程如下:
1. 获取属性流程
- 绘制图形并将句柄存储在变量中。
- 调用 get(句柄变量) 函数获取所有属性,或调用 get(句柄变量, '属性名') 函数获取特定属性。
mermaid graph LR A[绘制图形并获取句柄存入变量] --> B[调用get(句柄变量)获取所有属性] A --> C[调用get(句柄变量, '属性名')获取特定属性]
2. 设置属性流程
- 绘制图形并将句柄存储在变量中。
- 调用 set(句柄变量, '属性名', 属性值) 函数设置属性。
mermaid graph LR A[绘制图形并获取句柄存入变量] --> B[调用set(句柄变量, '属性名', 属性值)]

(五)绘图应用流程

绘图应用可以将数据以图形方式展示,以从函数绘图和从文件绘图为例,操作流程如下:
1. 从函数绘图流程
- 定义 y 向量和绘图类型的单元格数组。
- 调用 plotywithcell(y, 绘图类型单元格数组) 函数,该函数内部会使用 str2func 函数创建函数句柄,在子图中绘制不同类型的图并添加标题。
mermaid graph LR A[定义y向量和绘图类型单元格数组] --> B[调用plotywithcell(y, 绘图类型单元格数组)] B --> C[使用str2func创建函数句柄] C --> D[在子图中绘制图形并添加标题]
2. 从文件绘图流程
- 打开文件,检查是否成功打开。
- 读取文件数据,根据文件格式进行处理。
- 使用绘图函数绘制图形,设置坐标轴和标签。
- 关闭文件,检查是否成功关闭。
mermaid graph LR A[打开文件] --> B{文件是否成功打开} B -->|是| C[读取文件数据并处理] C --> D[使用绘图函数绘制图形] D --> E[设置坐标轴和标签] E --> F[关闭文件] F --> G{文件是否成功关闭} B -->|否| H[输出文件打开失败信息] G -->|否| I[输出文件关闭失败信息]

八、总结与建议

(一)总结

通过以上内容,我们学习了MATLAB绘图的多个方面,包括动画绘图、三维绘图、自定义绘图、图形属性操作和绘图应用等。掌握了不同绘图函数的使用方法和操作流程,以及如何避免常见陷阱和遵循编程风格指南。同时,通过大量的练习,可以进一步巩固所学知识。

(二)建议

  1. 多实践 :绘图是一个实践性很强的技能,通过不断地练习各种绘图操作和完成练习题目,可以更好地掌握MATLAB绘图。
  2. 深入研究函数 :MATLAB提供了丰富的绘图函数,除了文中介绍的,还有很多其他函数,如 scatter scatter3 等,可以深入研究这些函数的功能和用法,以满足不同的绘图需求。
  3. 结合实际问题 :将绘图技能应用到实际问题中,如数据分析、科学研究等,这样可以更好地理解绘图的意义和价值。
  4. 参考官方文档 :MATLAB官方文档是学习MATLAB的重要资源,当遇到问题时,可以参考官方文档获取更详细的信息和示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值