在MatLab中使用for循环绘制图形

时间:2016-05-31 07:49:56

标签: matlab plot graph

我正在尝试使用for循环绘制一个简单的图形,如下所示

x=linspace(0,2*pi,100);
for i=1:numel(x)
    y=sin(x(i));
    plot(x(i),y)
    hold on
end

然而,我的身材没有出现。那是为什么?

2 个答案:

答案 0 :(得分:3)

为什么会发生这种情况......

使用plot(x(i),y)绘制100个单点(每次迭代一个),默认情况下不会显示它们。因此情节看起来是空的。

解决方案1:矢量化计算和直接绘图

我认为你打算画一条连续线。在这种情况下,不需要for循环,因为您可以直接在MATLAB中计算和绘制矢量。所以下面的代码可能就是你想要的:

x = linspace(0,2*pi,100);
y = sin(x);
plot(x,y);

请注意,y是一个向量和x,而y(n)对于所有sin(x(n))都等于n。如果您想绘制点本身,请在调用plot时使用LineSpec - 语法,如此 1

plot(x,y,'*');

1)其他类型的点也是可能的,请参阅上面的链接文档。

解决方案2:计算for循环中的值并在之后绘制

如果你想计算for循环中的值并在之后绘制它:预先分配所需的变量(在这种情况下为y),计算for循环中的值,最后用计算后只需一个命令。

x = linspace(0,2*pi,100);

y = zeros(size(x));
for i = 1:numel(x)
    y(i) = sin(x(i));
end

plot(x,y);

解决方案3:在计算时动态更新绘图

如果你坚持在每次迭代中进行绘图,那么 Solution 2 中的前一个代码可以扩展如下:创建一个数字,添加一个空的'绘制它并存储其句柄。在for循环中计算值并将它们添加到y - 向量,如上所示。最后一步,您可以更改其XDataYData属性并调用drawnow来更新图表。请注意,每次在for循环中调用plot都会造成不必要的代价,而且我不推荐它。

% create figure and plot
figure;
ph = plot(0,0);
ax = gca;
set(ax,'XLim',[0,2*pi]);
set(ax,'YLim',[-1,1]);

% calculate and update plot
x = linspace(0,2*pi,100);
y = zeros(size(x));
for i = 1:numel(x)
    y(i) = sin(x(i));
    set(ph,'XData',x(1:i));
    set(ph,'YData',y(1:i));
    drawnow;
end

答案 1 :(得分:1)

简单方法

如果要在添加数据时绘制曲线,请尝试以下操作:

x = linspace(0,2 * pi, 100);
y = zeros(size(x));
for i=1:numel(x)
     y(i) = sin(x(i));
     plot(x(1:i), y(1:i), 'color', 'r')
     drawnow();
end

请注意,绘图会自动尝试设置x和y限制(曲线缩放到绘图窗口),以防止必须使用xlim和{{手动设置x和y限制1}}。

Matt在他的回答中写道,在每次迭代中调用ylim都非常昂贵(即耗时)。因此我建议使用数据源:

使用数据源更新图表

plot

在每次迭代中对% Create a panel and axes object h_panel = uipanel; h_axes = axes( 'Parent', h_panel); % Create data sources x = linspace(0,2 * pi, 100); y = zeros(size(x)); % Create graph object, in this case stairs % and bind the variables x and y as its data sources h_stairs = stairs(h_axes, x, y, 'XDataSource', 'x', 'YDataSource', 'y'); for i=1:size(x) y(i) = sin(x(i)); % Update the data of the stairs graph refreshdata(h_stairs); drawnow(); end 的调用都不是必需的,它仅用于更新视觉效果,因此您可以直接看到更改。