Matlab技术问询:如何使用for循环绘制不同输入的函数图像并解决仅显示最后一张图的问题
解决Matlab循环绘图只显示最后一张图的问题
我来帮你搞定这个问题——你的代码只显示最后一张图像,核心原因是Matlab默认调用plot()时会清除当前坐标轴的所有内容,每次循环都会把之前画的图覆盖掉。要在循环里保留多张图像,有两种实用的解决方案,我给你一步步说明:
方法1:用hold on在同一坐标轴叠加图像
这个方法适合把多张图放在同一个窗口里对比,只需要在循环开始前加一句hold on,告诉Matlab“不要清空当前坐标轴,继续在上面画图”,循环结束后可以用hold off恢复默认行为。
修改后的完整代码:
% 设定定义域为[x1,x2] x1 = [-2,-1]; % 加分号避免不必要的命令行输出 x2 = [2,2]; % 关键:开启图像保留模式 hold on; % 统一设置图像样式(可选,方便区分不同曲线) colors = ['r', 'b']; % 第一张红,第二张蓝 labels = {'x∈[-2,2]', 'x∈[-1,2]'}; % 绘制图像 for i = 1:length(x1) [domain, range, fplot] = vector(x1(i), x2(i), colors(i)); % 添加图例标签 set(fplot, 'DisplayName', labels{i}); end % 添加图例和标题 legend('Location', 'best'); title('不同定义域下的x²函数图像'); hold off; % 恢复默认绘图模式 function [x,y,fplot] = vector(a,b,color) x = linspace(a, b, 100); % 生成100个点,让曲线更平滑 f = @(x) x.^2; y = f(x); fplot = plot(x, y, 'Color', color, 'LineWidth', 1.5); % 指定颜色和线宽 end
关键细节说明:
hold on必须放在循环之前,否则第一次绘图还是会被覆盖;- 我给代码加了颜色区分和图例,方便你分辨不同定义域的曲线;
linspace(a,b,100)指定生成100个采样点,比默认点数更多,曲线会更平滑。
方法2:用subplot创建独立子图
如果想把两张图分开显示在同一个窗口的不同位置(比如左右排列),可以用subplot()函数,它能把当前窗口分成多个子坐标轴,每次循环在对应的子图里绘图。
修改后的完整代码:
% 设定定义域为[x1,x2] x1 = [-2,-1]; x2 = [2,2]; % 绘制图像 for i = 1:length(x1) % 创建子图:1行2列,第i个位置 subplot(1, 2, i); [domain, range, fplot] = vector(x1(i), x2(i)); % 给每个子图加标题 title(['定义域x∈[', num2str(x1(i)), ',', num2str(x2(i)), ']']); xlabel('x'); ylabel('y=x²'); end function [x,y,fplot] = vector(a,b) x = linspace(a, b, 100); f = @(x) x.^2; y = f(x); fplot = plot(x, y, 'LineWidth', 1.5); grid on; % 开启网格,更易读 end
关键细节说明:
subplot(m,n,p)表示把窗口分成m行n列,当前绘图在第p个位置(从左到右、从上到下计数);- 每个子图可以单独设置标题、坐标轴标签和网格,让图像更清晰。
内容的提问来源于stack exchange,提问作者DiegoIbanezCH




