我正在尝试使用for循环绘制一个简单的图形,如下所示
x=linspace(0,2*pi,100);
for i=1:numel(x)
y=sin(x(i));
plot(x(i),y)
hold on
end
然而,我的身材没有出现。那是为什么?
答案 0 :(得分:3)
使用plot(x(i),y)
绘制100个单点(每次迭代一个),默认情况下不会显示它们。因此情节看起来是空的。
我认为你打算画一条连续线。在这种情况下,不需要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)其他类型的点也是可能的,请参阅上面的链接文档。
如果你想计算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);
如果你坚持在每次迭代中进行绘图,那么 Solution 2 中的前一个代码可以扩展如下:创建一个数字,添加一个空的'绘制它并存储其句柄。在for循环中计算值并将它们添加到y
- 向量,如上所示。最后一步,您可以更改其XData
和YData
属性并调用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
的调用都不是必需的,它仅用于更新视觉效果,因此您可以直接看到更改。