matlab19款数学建模竞赛常用作图代码

1.二维曲线

二维曲线 是最常见的一种曲线,它能反应两个变量的因果关系。

>> x=linspace(1,200,100);%均匀生成数字1~200,共计100个
>> y1 = log(x)+ 1;%生成函数y=log(x)+1
>> y2 =log(x)+2;%生成函数y=log(x)+2
>> figure;
>> plot(x,y1);%作图 y=log(x)+1
>> hold on %多图共存在一个窗口上
>> plot(x,y2,'LineWidth',2);%作图 y=log(x)+2,LineWidth指线型的宽度,粗细尺寸2
>> hold off %关闭多图共存在一个窗口上
>> legend('y1','y2');%生成图例 y1和y2

在这里插入图片描述

  • plot(x,y’color’,‘r’,‘LineWidth’,1.5)
    ‘color’,‘r’——color是颜色,‘r’(红),g (绿),b(蓝),c(蓝绿),m (紫红),y(黄),k(黑), w (白)。
    LineWidth’1.5——线型的宽度,粗细尺寸1.5

2.二维散点图

x = linspace(1, 200, 100);
y1 = log(x) + 1;
y2 = log(x) + 2;
figure;
y3 = y1 + rand(1, 100) - 0.5;
plot(x, y1, 'LineWidth', 2, 'Color', [0.21, 0.21, 0.671]);%[0.21, 0.21, 0.671]为rbg
hold on
plot(x, y3, 'o', 'LineWidth', 2, 'Color', [0.46, 0.63, 0.90], 'MarkerFaceColor', [0.35, 0.90, 0.89], 'MarkerEdgeColor', [0.18, 0.62, 0.17]);
hold off

在这里插入图片描述
这段代码的功能是在同一张图上绘制两条曲线以及散点图。

具体的代码分析如下:

  1. 使用 linspace 函数生成一个包含 100 个数值的向量 x,范围为从 1 到 200。

    x = linspace(1, 200, 100);
    
  2. 根据 log 函数计算 y1 和 y2 的值,其中 y1 = log(x) + 1、y2 = log(x) + 2。

    y1 = log(x) + 1;
    y2 = log(x) + 2;
    
  3. 创建一个新的图形窗口。

    figure;
    
  4. 使用 rand 函数生成一个包含 100 个随机数的向量,每个随机数位于 -0.5 到 0.5 之间。然后将这个随机数向量加到 y1 的结果上得到 y3。

    y3 = y1 + rand(1, 100) - 0.5;
    
  5. 使用 plot 函数绘制第一个曲线,传入的参数依次为 x 值向量、y1 值向量,以及设置线的宽度为 2、颜色为 [0.21, 0.21, 0.671](即蓝色)。

    plot(x, y1, 'LineWidth', 2, 'Color', [0.21, 0.21, 0.671]);
    
  6. 使用 hold on 命令保持图形窗口的当前状态,使得后续的绘图命令不会清除先前的图形。

  7. 使用 plot 函数绘制第二个曲线和散点图,传入的参数依次为 x 值向量、y3 值向量,以及设置线的样式为 ‘o’(表示使用圆形标记)、线的宽度为 2、颜色为 [0.46, 0.63, 0.90](即浅蓝色)、标记填充颜色为 [0.35, 0.90, 0.89](即浅绿色)、标记边缘颜色为 [0.18, 0.62, 0.17](即深绿色)。

    plot(x, y3, 'o', 'LineWidth', 2, 'Color', [0.46, 0.63, 0.90], 'MarkerFaceColor', [0.35, 0.90, 0.89], 'MarkerEdgeColor', [0.18, 0.62, 0.17]);
    
  8. 使用 hold off 命令取消保持图形窗口的当前状态。

综上所述,该代码的作用是在同一张图上绘制两条曲线和散点图,展示了 x 值与 log(x)+1 的关系,并以不同的颜色和标记样式区分曲线和散点图。

3.二维渐变图

x = linspace(0,3*pi,200);
y= cos(x)+rand(1,200);%随机生成1*200,位于[0,1]的数字
sz=25;%尺寸为25
c = linspace(1,10,length(x));
scatter(x,y,sz,c,'filled')

在这里插入图片描述
这段代码的功能是生成一个散点图,其中 x 值为从 0 到 3π 之间等间隔的 200 个数值,y 值为对应的 cos(x) 值加上一个位于 0 到 1 之间的随机数。散点图中的每个点都有不同的颜色,颜色的取值范围和 x 值一致。

具体的代码分析如下:

  1. 使用 linspace 函数生成一个包含 200 个数值的向量 x,范围为从 0 到 3π。
  2. 使用 rand 函数生成一个包含 200 个随机数的向量,每个随机数位于 0 到 1 之间。然后将这个随机数向量加到 cos(x) 的结果上,得到 y 值。
  3. 设置变量 sz 的值为 25,表示散点的尺寸为 25。
  4. 使用 linspace 函数生成一个包含与向量 x 的长度相同的向量 c,范围为从 1 到 10。
  5. 使用 scatter 函数绘制散点图。传入的参数依次为 x 值向量、y 值向量、散点的尺寸向量、颜色向量和 ‘filled’ 表示用实心点绘制。

综上所述,该代码的作用是生成一个带有颜色映射的散点图,展示了 x 值与 cos(x) 和随机数之和之间的关系,并以尺寸大小和颜色来区分不同的数据点。

4.条形图

A = [60.689; 87.714; 143.1; 267.9515];
C = [127.5; 160.4; 231.9; 400.2];
B = C - A;
D = [A, B, C];

bar1 = bar([2:5:17], A, 'BarWidth', 0.2, 'FaceColor', 'k');
hold on;
bar2 = bar([3:5:18], B, 'BarWidth', 0.2, 'FaceColor', [0.5 0.5 0.51]);
hold on;
bar3 = bar([4:5:19], C, 'BarWidth', 0.2, 'FaceColor', 'w');

ylabel('耗时/s');
xlabel('GMM阶数');
legend('训练耗时', '测试耗时', '总耗时');

labelID = {'8阶', '16阶', '32阶', '64阶'};
set(gca, 'XTick', 3:5:20);
set(gca, 'XTickLabel', labelID);

在这里插入图片描述
这段代码用于绘制柱状图显示不同 GMM 阶数下的训练耗时、测试耗时和总耗时。

首先,代码定义了四个向量 A、C、B 和 labelID:

  • A:包含 GMM 阶数为 8、16、32 和 64 时的训练耗时(单位为秒)。
  • C:包含 GMM 阶数为 8、16、32 和 64 时的测试耗时(单位为秒)。
  • B:通过计算 C 减去 A 得到,表示不同 GMM 阶数下的测试耗时减去训练耗时的差值。
  • labelID:包含四个字符串,表示对应的 GMM 阶数。

然后,代码使用 bar 函数绘制柱状图:

  • bar1:绘制 GMM 阶数为 8、16、32 和 64 时的训练耗时,位于 x 轴上的位置为 [2:5:17]。柱状图的宽度为 0.2,颜色为黑色。
  • bar2:绘制 GMM 阶数为 8、16、32 和 64 时的测试耗时减去训练耗时的差值,位于 x 轴上的位置为 [3:5:18]。柱状图的宽度为 0.2,颜色为灰色。
  • bar3:绘制 GMM 阶数为 8、16、32 和 64 时的测试耗时,位于 x 轴上的位置为 [4:5:19]。柱状图的宽度为 0.2,颜色为白色。

接着,代码设置了图表的标题、标签和图例:

  • ylabel('耗时/s'):设置 y 轴的标签为 “耗时/s”。
  • xlabel('GMM阶数'):设置 x 轴的标签为 “GMM阶数”。
  • legend('训练耗时', '测试耗时', '总耗时'):设置图例,分别对应训练耗时、测试耗时和总耗时。

最后,代码使用 set 函数设置 x 轴刻度的位置和标签:

  • set(gca, 'XTick', 3:5:20):设置 x 轴的刻度位置为 [3, 8, 13, 18]
  • set(gca, 'XTickLabel', labelID):设置 x 轴的刻度标签为 labelID 中的字符串。

通过这段代码,我们可以直观地比较不同 GMM 阶数下的训练耗时、测试耗时和总耗时,从而进行性能分析和比较。

5.填充图

x = 0.4:0.1:2*pi;
y1 = sin(2*x);
y2 = sin(x);

% 确定y1和y2的上下边界
maxY = max([y1; y2]);
minY = min([y1; y2]);

% 确定填充多边形,按照顺时针方向来确定点
xFill = [x, fliplr(x)];
yFill = [maxY, fliplr(minY)];

figure;
fill(xFill, yFill, [0.21, 0.21, 0.67]);
hold on;

% 绘制轮廓线
plot(x, y1, 'k', 'LineWidth', 2);
plot(x, y2, 'k', 'LineWidth', 2);

hold off;

在这里插入图片描述
上面的代码实现了以下功能:

  1. 首先,通过x = 0.4:0.1:2*pi;生成了一个从0.4到2π的等差数列作为x轴的坐标。

  2. 接下来,使用sin(2*x)sin(x)分别计算了两个函数yly2关于x的取值。

  3. 通过maxY = max([yl; y2]);minY = min([yl; y2]);确定了两个函数的上下边界。

  4. 使用xFill = [x, fliplr(x)];生成了一个用于填充的多边形的x轴坐标,通过yFill = [maxY, fliplr(minY)];生成了对应的y轴坐标。

  5. 创建一个图形窗口 figure;

  6. 使用fill(xFill, yFill, [0.21, 0.21, 0.67]);将多边形填充颜色设置为淡蓝色。

  7. 进行图形绘制操作时,使用hold on;来保持图形窗口不关闭。

  8. 使用plot(x, y1, 'k', 'LineWidth', 2);plot(x, y2, 'k', 'LineWidth', 2);分别绘制了函数y1y2的轮廓线。这里的'k'表示线的颜色为黑色,'LineWidth', 2表示线的宽度为2。

  9. 使用hold off;释放图形窗口,使其可以响应进一步的交互操作。

这段代码的作用是绘制两个函数的轮廓线,并在函数曲线和曲线之间的区域使用填充色进行区分。

6.多Y轴图

figure;
load('accidents.mat', 'hwydata')
ind = 1:51;
drivers = hwydata(:, 5);

yyaxis left
scatter(ind, drivers, 'LineWidth', 2);
title('Highway Data');
xlabel('States');
ylabel('Licensed Drivers (thousands)');

pop = hwydata(:, 7);

yyaxis right
scatter(ind, pop, 'LineWidth', 2);
ylabel('Vehicle Miles Traveled (millions)');

在这里插入图片描述
上述代码主要涉及到绘制散点图以及设置图形的标题和轴标签。下面是对代码进行分析的解释:

  1. figure;:创建一个新的图形窗口,用于显示绘图结果。

  2. load('accidents.mat', 'hwydata'):从名为accidents.mat的MAT文件中加载变量hwydata

  3. ind = 1:51;:创建一个数组ind,包含从1到51的整数,用于表示各个州。

  4. drivers = hwydata(:, 5);:将第5列(Licensed Drivers)的数据提取到变量drivers中。

  5. yyaxis left:设置左侧y轴为活动状态,用于在该轴上绘制数据。

  6. scatter(ind, drivers, 'LineWidth', 2);:绘制散点图,x轴为ind,y轴为drivers,线条宽度为2。

  7. title('Highway Data');:设置图形的标题为"Highway Data"。

  8. xlabel('States');:设置x轴的标签为"States"。

  9. ylabel('Licensed Drivers (thousands)');:设置左侧y轴的标签为"Licensed Drivers (thousands)"。

  10. pop = hwydata(:, 7);:将第7列(Vehicle Miles Traveled)的数据提取到变量pop中。

  11. yyaxis right:将右侧y轴设置为活动状态,用于在该轴上绘制数据。

  12. scatter(ind, pop, 'LineWidth', 2);:绘制散点图,x轴为ind,y轴为pop,线条宽度为2。

  13. ylabel('Vehicle Miles Traveled (millions)');:设置右侧y轴的标签为"Vehicle Miles Traveled (millions)"。

通过这段代码,你可以同时展示各个州的已领驾照人数和车辆行驶里程的情况,并且能够直观地比较这两个数据之间的关系。

7.二维场图

[x, y] = meshgrid(0:0.1:1, 0:0.1:1);
u = x;
v = -y;
startx = 0.1:0.1:0.9;
starty = ones(size(startx));

% 需要获取所有流线的属性
figure;
quiver(x, y, u, v); % 该函数使用箭头来直观的显示矢量场小箭头来表示以该点为起点的向量(u,v)
streamline(x, y, u, v, startx, starty);

在这里插入图片描述

  1. 创建一个网格,其中x和y的取值范围为0到1,网格间隔为0.1。meshgrid(0:0.1:1, 0:0.1:1)将生成两个矩阵x和y,分别包含了网格中的所有点的x和y坐标。

  2. 定义两个矢量场(矢量场用于表示流线或箭头),u和v,其中u的值等于x,v的值等于-y。这意味着矢量场的方向将在x轴正方向和y轴负方向上。

  3. 定义起始点的x坐标为0.1到0.9,间隔为0.1,并定义起始点的y坐标为1。

  4. 创建一个新的图形窗口。

  5. 使用quiver函数绘制矢量场的箭头图,其中x和y表示网格中的位置,u和v表示在该位置的箭头的方向和大小。

  6. 使用streamline函数绘制流线图,其中x和y表示网格中的位置,u和v表示在该位置的矢量场,startx和starty表示流线的起点。

总结起来,该代码的目的是绘制一个矢量场的箭头图和流线图,用于表示在给定位置的流场情况。

8.三维曲线图

figure;
t=0:pi/20:10*pi;
xt=sin(t);
yt = cos(t);
plot3(xt,yt, t,'-o','Color',...
'b','MarkerSize',10);

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口(figure)。

  2. 创建一个时间间隔为pi/20的向量t,范围从0到10*pi。

  3. 使用sin函数生成一个向量xt,其中元素是向量t中对应元素的sin值。

  4. 使用cos函数生成一个向量yt,其中元素是向量t中对应元素的cos值。

  5. 使用plot3函数绘制一个3D图形,其中xt表示x坐标,yt表示y坐标,t表示z坐标。'-o’表示使用线条连接,并在每个点处绘制圆形标记。‘Color’,'b’表示线条颜色为蓝色。"MarkerSize"指定圆形标记的尺寸为10。

这段代码的目的是在3D坐标轴上绘制一条曲线,该曲线的x坐标是sin(t),y坐标是cos(t),z坐标是t。

9.三维散点图

figure;
[X, Y, Z] = sphere(16);
x = [0.5*X(:); 0.75*X(:); X(:)];
y = [0.5*Y(:); 0.75*Y(:); Y(:)];
z = [0.5*Z(:); 0.75*Z(:); Z(:)];
S = repmat([70, 50, 20], numel(X), 1);
C = repmat([1, 2, 3], numel(X), 1);
s = S(:);
c = C(:);
h = scatter3(x, y, z, s, c);
h.MarkerFaceColor = [0 0.5 0.5];

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口(figure)。

  2. 使用sphere函数生成一个球体模型,并返回球体上16个等距点的坐标,分别存储在X、Y和Z三个矩阵中。

  3. 根据球体坐标,创建新的x、y、z向量,将球体的各个点分别按照0.5倍、0.75倍和原始大小进行缩放。

  4. 使用repmat函数将一个大小为(numel(X)*3)×3的矩阵S复制扩展为一个与x、y、z向量长度相同的矩阵,用于指定散点的大小。

  5. 使用repmat函数将一个大小为(numel(X)*3)×3的矩阵C复制扩展为一个与x、y、z向量长度相同的矩阵,用于指定散点的颜色。

  6. 将大小和颜色的矩阵展平为一维向量。

  7. 使用scatter3函数在3D坐标系中绘制散点图,其中x、y、z为散点的坐标,s为散点的大小,c为散点的颜色。

  8. 设置散点的实心标记的颜色为[0 0.5 0.5]。

总结起来,该代码的目的是在3D坐标系中绘制一个球体的散点图,散点的大小和颜色根据距离和索引进行变化。

x = linspace(1,200,100);
y1 = log(x) + 1;
y2 = log(x) + 2;
y3 = y1 + rand(1,100) - 0.5;
figure;
scatter3(x,y2,y3, x, x,'filled');

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个长度为100的向量x,其中元素从1到200等间隔分布。

  2. 使用log函数对向量x进行运算,并加上常数1,将结果存储在向量y1中。

  3. 使用log函数对向量x进行运算,并加上常数2,将结果存储在向量y2中。

  4. 生成一个1行100列的随机数矩阵,每个元素从0到1之间均匀分布,然后减去0.5,将结果与向量y1相加,将最终结果存储在向量y3中。

  5. 创建一个新的图形窗口(figure)。

  6. 使用scatter3函数在三维坐标系中绘制散点图,其中x轴对应向量x,y轴对应向量y2,z轴对应向量y3。散点的大小和颜色都使用x向量的值进行映射,并设置为填充形式。

总结起来,该代码的目的是绘制一个三维散点图,其中x轴对应线性间隔的向量x,y轴对应log(x)+2的结果,z轴对应log(x)+1与生成的随机数相加的结果,散点的大小和颜色由x轴的值确定。

10.三维伪彩图

[x, y, z] = peaks(30);
figure;
plot1 = subplot(1, 2, 1);
surf(x, y, z);
colormap(parula); % 设置第一幅图的颜色映射为parula

在这里插入图片描述
上述代码执行了以下操作:

  1. 使用peaks函数生成一个30×30的山峰数据,将生成的x、y、z坐标分别存储在对应的变量中。

  2. 创建一个新的图形窗口(figure)。

  3. 使用subplot函数创建一个1行2列的子图区域,并选择第一个子图作为当前绘图区域。

  4. 使用surf函数绘制第一幅子图,其中x、y、z分别表示X轴、Y轴和Z轴坐标,绘制了山峰的三维表面。

  5. 使用colormap函数将颜色映射设置为parula,即将第一幅子图的颜色显示为parula色彩映射。

总结起来,该代码的目的是绘制一个具有30×30个数据点的山峰三维伪彩图,并使用parula色彩映射进行颜色显示。

 figure;
h1 = surf(x, y, z);
hold on
h2 = surf(x, y,z + 5);
hold off
colormap(hot);

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口(figure)。

  2. 使用surf函数绘制第一幅子图,其中x、y、z分别表示X轴、Y轴和Z轴坐标,并将返回的图形对象存储在变量h1中。

  3. 使用hold on命令,将当前绘图区域置于保持状态,这样可以在同一个图形窗口中绘制多个图形。

  4. 使用surf函数再次绘制第二幅子图,其中x、y分别为X轴和Y轴坐标,z+5为新的Z轴坐标,即在原有山峰的基础上整体上升5个单位高度。同样,将返回的图形对象存储在变量h2中。

  5. 使用hold off命令,退出保持状态。

  6. 使用colormap函数将颜色映射设置为hot。

总结起来,该代码的目的是在一个图形窗口中绘制两个山峰的三维表面图,第一个山峰使用默认的颜色映射(parula),第二个山峰整体上升5个单位高度,并使用hot颜色映射进行颜色显示。

11.裁剪伪彩图

figure;
n = 300;
[x, y, z] = peaks(n);

subplot(2, 2, [1, 3])
surf(x, y, z);
shading interp;
view(0, 90);

for i = 1:n
    for j = 1:n
        if x(i, j)^2 + 2 * y(i, j)^2 > 6 && 2 * x(i, j)^2 + y(i, j)^2 < 6
            z(i, j) = NaN;
        end
    end
end

subplot(2, 2, 2)
surf(x, y, z);
shading interp;
view(0, 90);

subplot(2, 2, 4)
surf(x, y, z);
shading interp;

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口(figure)。

  2. 使用peaks函数生成一个n×n的山峰数据,将生成的x、y、z坐标分别存储在对应的变量中。

  3. 创建一个2行2列的图形子区域,并选取第1行第1列和第2行第1列的子图作为当前绘图区域。

  4. 在第1行第1列的子图中使用surf函数绘制山峰的三维表面,并使用shading interp进行插值着色,使图像更加平滑。然后将视角设置为(0, 90),即顶视图。

  5. 使用双重循环遍历山峰数据中的每个点,并通过判断条件将满足条件的点的高度(z值)设置为NaN,使其不显示在图中。

  6. 在第2行第1列的子图中,使用修正后的山峰数据再次绘制三维表面图,并使用shading interp进行插值着色,然后将视角设置为(0, 90)。

  7. 在第2行第2列的子图中,使用修正后的山峰数据绘制另一个三维表面图,并使用shading interp进行插值着色。

总结起来,该代码的目的是在一个图形窗口中绘制四个子图,第一个子图为原始山峰数据的三维表面图,第二个子图中将符合条件的点的高度设置为NaN,第三个子图重新绘制了修正后的山峰数据的三维表面图,第四个子图也绘制了修正后的山峰数据的三维表面图。所有子图都使用插值着色并观察角度设置为顶视图。

12.等高线图

figure;
[X, Y, Z] = peaks;
subplot(2,2,1);
contour(X, Y, Z, 20, 'LineWidth', 2);
subplot(2,2,2);
contour(X, Y, Z, '--', 'LineWidth', 2);
subplot(2,2,3);
v = [1, 1];
contour(X, Y, Z, v, 'LineWidth', 2);
x = -2:0.2:2;
y = -2:0.2:3;
[X, Y] = meshgrid(x, y);
Z = X .* exp(-X.^2 - Y.^2);
subplot(2,2,4);
contour(X, Y, Z, 'ShowText', 'on', 'LineWidth', 2);

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口(figure)。

  2. 使用peaks函数生成一个默认大小的山峰数据,将生成的x、Y、Z坐标分别存储在对应的变量中。

  3. 创建一个2行2列的图形子区域,并选取第1行第1列的子图作为当前绘图区域。

  4. 在第1行第1列的子图中使用contour函数绘制等高线图,使用20个等高线线,并将线宽设置为2。

  5. 在第1行第2列的子图中使用contour函数绘制等高线图,使用虚线样式’–',并将线宽设置为2。

  6. 在第2行第1列的子图中使用contour函数绘制等高线图,指定了一个特定的等高线值v为[1,1],并将线宽设置为2。

  7. 重新定义x和y的取值范围,并利用meshgrid函数生成新的二维网格。

  8. 使用新的网格数据和函数Z=X.*exp(-X.^2 - Y.^2)生成新的Z值。

  9. 在第2行第2列的子图中使用contour函数绘制新的等高线图,并设置显示等高线上的数值,线宽设置为2。

总结起来,该代码的目的是在一个图形窗口中绘制四个子图。第一个子图是原始山峰数据的等高线图,第二个子图是带有虚线的原始山峰数据的等高线图,第三个子图是指定等高线值的原始山峰数据的等高线图,第四个子图是基于新生成的网格和函数生成的等高线图,并显示等高线上的数值。每个子图中的等高线线宽都为2。

13.三维等高线图

 figure('Position', [0, 0, 900, 400]);
subplot(1, 3, 1);
[X, Y, Z] = sphere(50);
contour3(X, Y, Z, 'LineWidth', 2);
[X, Y] = meshgrid(-2:0.25:2);
Z = X .* exp(-X.^2 - Y.^2);
subplot(1, 3, 2);
contour3(X, Y, Z, [-0.2, -0.1, 0.1, 0.2], 'ShowText', 'on', 'LineWidth', 2);
[X, Y, Z] = peaks;
subplot(1, 3, 3);
contour3(X, Y, Z, 2, 'LineWidth', 2);

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口,设置其位置为 [0, 0, 900, 400]。

  2. 创建一个含有 1 行 3 列的图形子区域,选择第 1 列的子图作为当前绘图区域。

  3. 使用 sphere 函数生成一个球体的数据,将生成的 x、y、z 坐标分别存储在对应的变量中。

  4. 在第 1 列的子图中,使用 contour3 函数绘制球体的等高线图,线宽设为 2。

  5. 重新定义 x、y 的取值范围,并利用 meshgrid 函数生成新的二维网格。

  6. 使用新的网格数据和函数 Z = X .* exp(-X.^2 - Y.^2) 生成新的 z 值。

  7. 在第 2 列的子图中,使用 contour3 函数绘制新生成的数据的等高线图,指定等高线标注值为 -0.2、-0.1、0.1、0.2,并显示等高线上的数值,线宽设为 2。

  8. 使用 peaks 函数生成默认大小的山峰数据,将生成的 x、y、z 坐标分别存储在对应的变量中。

  9. 在第 3 列的子图中,使用 contour3 函数绘制山峰数据的等高线图,指定等高线标注值为 2,并设定线宽为 2。

总结起来,该代码的目的是在一个图形窗口中绘制三个子图。第一个子图是球体数据的等高线图,第二个子图是新生成数据的等高线图,第三个子图是山峰数据的等高线图。每个子图中的等高线线宽都为 2。在第二个和第三个子图中,还显示了特定等高线值上的数值。

14.等高线填充图

figure;
subplot(2, 2, 1);
[X, Y, Z] = peaks(50);
contourf(X, Y, Z);
subplot(2, 2, 2);
contourf(X, Y, Z, '--');
subplot(2, 2, 3);
contourf(X, Y, Z, [2, 3], 'ShowText', 'on');
subplot(2, 2, 4);
contourf(X, Y, Z, [2, 2]);

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口。

  2. 创建一个2行2列的图形子区域,并选择第1行第1列的子图作为当前绘图区域。

  3. 使用peaks函数生成大小为50的山峰数据,并将生成的x、Y、Z坐标分别存储在对应的变量中。

  4. 在第1行第1列的子图中使用contourf函数绘制山峰数据的等高线填充图。

  5. 在第2行第2列的子图中使用contourf函数绘制带有虚线样式的山峰数据的等高线填充图。

  6. 在第1行第2列的子图中使用contourf函数绘制山峰数据的等高线填充图,并限定等高线范围为2到3,并显示等高线上的数值。

  7. 在第2行第1列的子图中使用contourf函数绘制山峰数据的等高线填充图,并限定等高线范围为2到2。

总结起来,该代码的目的是在一个图形窗口中绘制四个子图。前两个子图是山峰数据的等高线填充图,第三个子图是带有虚线样式的山峰数据的等高线填充图,第四个子图是山峰数据的等高线填充图,并指定了不同的等高线范围。

15.三维矢量场图

figure;
[X, Y, Z] = peaks(30);
% 矢量场,曲面法线
[U, V, W] = surfnorm(X, Y, Z);
% 箭头长度、颜色
quiver3(X, Y, Z, U, V, W, 0.5, 'r');
hold on
surf(X, Y, Z);
xlim([-3, 3]);
ylim([-3, 3.2]);
shading interp
hold off
view(0, 90);

在这里插入图片描述
上述代码执行了以下操作:

  1. 创建一个新的图形窗口。

  2. 使用peaks函数生成大小为30的山峰数据,并将生成的X、Y、Z坐标分别存储在对应的变量中。

  3. 使用surfnorm函数计算曲面的法线向量,分别存储在U、V、W变量中。

  4. 使用quiver3函数在三维空间中绘制矢量场,箭头的起点为山峰曲面的坐标(X, Y, Z),箭头的方向为曲面的法线向量(U, V, W),箭头的长度为0.5,颜色为红色。

  5. 使用hold on命令,保持图形窗口的当前内容,以便在之后的操作中叠加绘图。

  6. 使用surf函数绘制原始的山峰曲面,根据之前生成的X、Y、Z坐标。

  7. 使用xlim和ylim函数限制x轴和y轴的显示范围。

  8. 使用shading interp命令实现曲面的平滑着色效果。

  9. 使用hold off命令,释放图形窗口的保持,使得之后的绘图操作不再叠加在当前内容之上。

  10. 使用view函数调整视角,设置观察角度为0度仰视,90度侧视。

总结起来,该代码的目的是在一个图形窗口中绘制一个山峰曲面,并在曲面上显示法线矢量的箭头。通过调整视角和设置着色方式,使得曲面呈现出平滑的效果。这样的可视化分析有助于理解和研究山峰曲面的特征和性质。

16.伪彩图+投影图

x = linspace(-3, 3, 30);
y = linspace(-4, 4, 40);
[X, Y] = meshgrid(x, y);
Z = peaks(X, Y);
Z(5:10, 15:20) = 0;
z1 = max(Z);
z2 = max(Z, [], 2);

figure;
subplot(3, 3, [1, 2]);
plot(x, z1, 'LineWidth', 2);

subplot(3, 3, [4, 7]);
plot(z2, y, 'LineWidth', 2);

subplot(3, 3, [3, 6, 9]);
surf(X, Y, Z);
xlim([-3, 3]);
ylim([-4, 4]);
view(0, 90);
shading interp;

在这里插入图片描述
以下是对代码的分析:

  1. 使用linspace函数生成了一个包含30个值的等间隔向量x,范围为-3到3。同样,使用linspace生成了一个包含40个值的等间隔向量y,范围为-4到4。

  2. 使用meshgrid函数将xy向量创建为二维网格,生成XY表示网格坐标。

  3. 调用peaks函数,根据生成的网格坐标XY计算对应的山峰高度数据,并将结果存储在Z中。

  4. Z中的部分数据置为0,即将第5到第10行、第15到第20列的元素设置为0。这会在山峰曲面中创建一个凹陷区域。

  5. 在图形窗口中创建一个figure,并将其分割为3行3列的子图区域。

  6. 在第1、2个子图中,绘制了关于xz1的线图,线宽为2。这将显示x轴与对应的最大高度值z1之间的关系。

  7. 在第4、7个子图中,绘制了关于z2y的线图,线宽为2。这将显示y轴与对应的最大高度值z2之间的关系。

  8. 在第3、6、9个子图中,使用surf函数绘制了山峰曲面,使用之前生成的网格坐标XY和对应的山峰高度值Z。设置了x和y轴的显示范围,并设置了视角为0度仰视,90度侧视。使用shading interp实现平滑着色效果。

通过分析代码,可以得出以下结论:该代码主要用于生成山峰曲面以及相关的线图,展示了不同维度之间的关系。绘制的曲面和线图有助于对山峰数据的特征进行可视化分析和研究。

17.热图

z = rand(50);
z(z >= 0.0 & z < 0.6) = 0.5;
z(z >= 0.6 & z < 0.8) = 0.7;
z(z >= 0.8 & z <= 1) = 0.9;
for i = 1:30
    z(randi(50,1,1):end, i) = nan;
end
for i = 31:50
    z(30 + randi(20,1,1):end, i) = nan;
end
z(20:25, 40:45) = nan;
figure;
ax = pcolor(z);
view(0, 90);
ax.EdgeColor = [1 1 1];

在这里插入图片描述
以下是对代码的分析:

  1. 代码开始处通过rand函数生成了一个大小为50x50的随机矩阵z,其中的元素值在0到1之间。

  2. 使用逻辑条件运算符&对矩阵z进行筛选操作,将满足条件的元素值区间[0.0, 0.6)的元素设置为0.5,将区间[0.6, 0.8)的元素设置为0.7,将区间[0.8, 1]的元素设置为0.9。

  3. 使用循环结构,首先对前30列的每一列进行操作,通过随机数生成一个行索引,将该行及其以下的元素设置为NaN,即缺失值。

  4. 接着对第31到50列的每一列进行类似的操作,生成一个行索引,将从该行开始的元素设置为NaN

  5. 使用行和列索引的方式,将矩阵中的20到25行、40到45列的元素设置为NaN

  6. 创建一个新的图形窗口。

  7. 使用pcolor函数绘制z的伪彩色图,将z的值表示为颜色。返回一个图块对象ax

  8. 使用view函数将视角设置为0度仰视、90度旋转。

  9. 使用ax.EdgeColor将图块的边界颜色设置为白色。

通过上述分析,可以得出以下结论:该代码主要是对一个随机矩阵进行一系列的操作,包括将特定区域的元素置为特定值、设置部分元素为缺失值NaN,以及绘制矩阵的伪彩色图形。这些操作有助于对随机矩阵的特征和可视化展示进行分析。

18.分子模型图

[x,y,z] = sphere(100);
C = 10; 
H = 5;
figure;
% 大球
surf(C*x, C*y, C*z, 'FaceColor', 'red', 'EdgeColor', 'none');
hold on
% 四个小球,位置通过计算确定,这里是演示位置
surf(H*x, H*y, H*z + 10, 'FaceColor', 'blue', 'EdgeColor', 'none');
surf(H*x + 10, H*y, H*z - 3, 'FaceColor', 'blue', 'EdgeColor', 'none');
surf(H*x - 4, H*y - 10, H*z - 3, 'FaceColor', 'blue', 'EdgeColor', 'none');
surf(H*x - 4, H*y + 10, H*z - 3, 'FaceColor', 'blue', 'EdgeColor', 'none');
% 坐标轴设置
axis equal off
% 设置光源,增加立体感
light
lighting gouraud

在这里插入图片描述
这段代码主要是用来绘制一个大球和四个小球的图形,并通过调整位置、颜色和光照效果增加图形的立体感。

首先,通过调用sphere函数生成一个球面的坐标信息,其中[x, y, z]是球面点的坐标。这里设置参数100表示生成100个点。

然后,定义了变量C=10表示大球的大小,H=5表示小球的大小。

创建一个新的图形窗口。

使用surf函数绘制大球,以C*xC*yC*z作为坐标,并设置面的颜色为红色,边界颜色为无。

通过hold on指令确保在同一幅图上绘制多个对象。

接下来,通过surf函数四次绘制小球。每次绘制一个小球,H*xH*yH*z分别表示坐标偏移量,具体位置需要根据计算确定。这里为了演示,给出了大概的位置。所有的小球颜色都设置为蓝色,边界颜色设为无。

使用axis equal off命令设置坐标轴的比例为等比例,并隐藏坐标轴。

通过light函数设置光源,增加图形的立体感知。

最后,使用lighting gouraud命令设置光照模型为高洛德模型,使图形受光照影响更加真实。

综上所述,这段代码通过绘制球体并调整属性来实现一个具有立体感的图形场景。

19.分形图

figure;
a=1.7;b=1.7;c=0.6;d=1.2;
x=0;y=0;
n = 100000;
kx = zeros(1, n);
ky = zeros(1, n);
% 迭代循环
for i = 1:n
    tempx = sin(a * y) + c * cos(a * x);
    tempy = sin(b * x) + d * cos(b * y);
    % 存入数组
    kx(i) = tempx;
    ky(i) = tempy;
    % 重新赋值 x, y
    x = tempx;
    y = tempy;
end
scatter(kx, ky, 0.1, 'green');

在这里插入图片描述
这段代码主要是通过迭代循环计算并存储一系列点的坐标,并使用scatter函数将这些点以绿色小圆点的形式绘制出来。

具体分析如下:

  1. 创建一个新的图形窗口。

  2. 定义变量a、b、c和d的值分别为1.7、1.7、0.6和1.2。

  3. 初始化变量x和y的值为0。

  4. 设置变量n的值为100000,表示迭代的次数。

  5. 创建两个大小为1x100000的零数组kx和ky,用于存储迭代过程中生成的点的坐标。

  6. 开始迭代循环,从1到n。

  7. 在循环中,通过sin和cos函数计算每个点的新坐标,将其分别存储在临时变量tempx和tempy中。

  8. 将tempx和tempy分别保存到kx和ky数组中,用于存储所有生成点的坐标。

  9. 更新x和y的值为tempx和tempy,以便下一次迭代使用。

  10. 循环结束后,使用scatter函数将存储的点以0.1大小的绿色小圆点形式绘制出来。

综上所述,该代码通过迭代计算一系列点的坐标并绘制出来,可以得到一个具有一定规律性和吸引力的图案。

  • 37
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值