如何在曲线移动而不是轴移动的 MATLAB 中制作动画?
How to make animation in MATLAB which the curve is moving, not axes is moving?
我想绘制 y=omega*x^2,其中 omega 是 -3 到 3,步长为 0.25,x 从 -4 到 4,步长为 0.001。但是这段代码给我的曲线是不能移动的,轴是移动的。我希望曲线在移动,像这样。
x=-4:0.001:4;
for omega=-3:0.25:3
for i=1:length(x)
y(i)=omega*x(i)^2;
end
plot(x,y);
pause(0.1);
end
怎么做?
一种快速的方法是在每个绘图后使用 axis([xmin, xmax, ymin, ymax]) 命令在循环中设置 x 轴和 y 轴的限制。这种方法不是万无一失的,如果脚本在绘图之后但在设置轴限制之前得到帮助,但在大多数情况下它应该有效。
figure(1)
x=-4:0.001:4;
for omega=-3:0.25:3
for i=1:length(x)
y(i)=omega*x(i)^2;
end
plot(x,y);
axis([-4 4 -50 50])
pause(0.1);
end
正如另一个答案所指出的,您需要设置轴限制。
(另请注意,没有理由使用循环来计算 y
。)
但是,与其每次循环都使用 plot
,不如只创建一次该行,然后每次都替换该行的 x
和 y
数据更有效通过循环。
x=-4:0.001:4;
all_omega=-3:0.25:3;
for idx = 1:numel(all_omega)
omega = all_omega(idx);
y=omega*(x.^2);
if idx == 1
% create line
hl = plot(x,y);
axis([-4,4,-40,40]);
box on
grid on
else
% replace line data
set(hl,'XData',x,'YData',y);
end
title(sprintf('\Omega = %.2f',omega));
pause(0.1);
end
或者您可能想使用 animatedline
,
x=-4:0.001:4;
all_omega=-3:0.25:3;
for idx = 1:numel(all_omega)
omega = all_omega(idx);
y=omega*(x.^2);
if idx == 1
% create animated line
am = animatedline(x,y);
axis([-4,4,-40,40]);
box on
grid on
else
% replace the line
clearpoints(am)
addpoints(am,x,y);
end
title(sprintf('\Omega = %.2f',omega));
pause(0.1);
end
这与@phil-goddard的答案相同,但更有效地使用了动画 YData 和标题字符串的句柄。
x = -4 : 0.001 : 4;
y = zeros(1, numel(x));
omega_range = -3 : 0.25 : 3;
% Create line and title, and obtain handles to them.
h_plot = plot(x, y);
axis([-4, 4, -40, 40]);
box on;
grid on;
h_title = title(sprintf('\omega = %.2f', 0));
for idx = 1:numel(omega_range)
omega = omega_range(idx);
y = omega * (x.^2);
% Replace y data.
h_plot.YData = y;
% Replace title string.
h_title.String = sprintf('\omega = %.2f', omega);
pause(0.1);
end
我想绘制 y=omega*x^2,其中 omega 是 -3 到 3,步长为 0.25,x 从 -4 到 4,步长为 0.001。但是这段代码给我的曲线是不能移动的,轴是移动的。我希望曲线在移动,像这样。
x=-4:0.001:4;
for omega=-3:0.25:3
for i=1:length(x)
y(i)=omega*x(i)^2;
end
plot(x,y);
pause(0.1);
end
怎么做?
一种快速的方法是在每个绘图后使用 axis([xmin, xmax, ymin, ymax]) 命令在循环中设置 x 轴和 y 轴的限制。这种方法不是万无一失的,如果脚本在绘图之后但在设置轴限制之前得到帮助,但在大多数情况下它应该有效。
figure(1)
x=-4:0.001:4;
for omega=-3:0.25:3
for i=1:length(x)
y(i)=omega*x(i)^2;
end
plot(x,y);
axis([-4 4 -50 50])
pause(0.1);
end
正如另一个答案所指出的,您需要设置轴限制。
(另请注意,没有理由使用循环来计算 y
。)
但是,与其每次循环都使用 plot
,不如只创建一次该行,然后每次都替换该行的 x
和 y
数据更有效通过循环。
x=-4:0.001:4;
all_omega=-3:0.25:3;
for idx = 1:numel(all_omega)
omega = all_omega(idx);
y=omega*(x.^2);
if idx == 1
% create line
hl = plot(x,y);
axis([-4,4,-40,40]);
box on
grid on
else
% replace line data
set(hl,'XData',x,'YData',y);
end
title(sprintf('\Omega = %.2f',omega));
pause(0.1);
end
或者您可能想使用 animatedline
,
x=-4:0.001:4;
all_omega=-3:0.25:3;
for idx = 1:numel(all_omega)
omega = all_omega(idx);
y=omega*(x.^2);
if idx == 1
% create animated line
am = animatedline(x,y);
axis([-4,4,-40,40]);
box on
grid on
else
% replace the line
clearpoints(am)
addpoints(am,x,y);
end
title(sprintf('\Omega = %.2f',omega));
pause(0.1);
end
这与@phil-goddard的答案相同,但更有效地使用了动画 YData 和标题字符串的句柄。
x = -4 : 0.001 : 4;
y = zeros(1, numel(x));
omega_range = -3 : 0.25 : 3;
% Create line and title, and obtain handles to them.
h_plot = plot(x, y);
axis([-4, 4, -40, 40]);
box on;
grid on;
h_title = title(sprintf('\omega = %.2f', 0));
for idx = 1:numel(omega_range)
omega = omega_range(idx);
y = omega * (x.^2);
% Replace y data.
h_plot.YData = y;
% Replace title string.
h_title.String = sprintf('\omega = %.2f', omega);
pause(0.1);
end