我正在尝试在Matlab的轮廓图中标记并连接最大点。
如果我举一个简单的例子:
x = -2:0.2:2;
y = -2:0.2:3;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
contour(X,Y,Z,'ShowText','on')
它给出了下面的轮廓曲线,黑线和红圈是我想要绘制的。
我尝试搜索Z中每一行的最大值索引,然后绘制相应的X和Y值。 这并没有为我最初的问题提供正确的值。
我要寻找的是是否有一种方法可以自动从图形/数据中提取这些值。
答案 0 :(得分:2)
可以从对contour
的调用中提取轮廓线的数据。返回的第一个值是contour matrix,可以对其进行解析以为您提供每条轮廓线的点。然后,找到“最大”点只是后勤问题,您似乎真的是想沿着轮廓上具有最大y
值的点:
x = -2:0.2:2;
y = -2:0.2:3;
[X,Y] = meshgrid(x,y);
Z = X.*exp(-X.^2-Y.^2);
M = contour(X,Y,Z,'ShowText','on');
inow = 1;
maxpoints = [];
while inow < size(M,2)
% column at inow contains level value and number of points in contour line
level = M(1,inow);
nvals = M(2,inow);
% extract coordinates of the corresponding contour line
xvals = M(1,inow+1:inow+nvals);
yvals = M(2,inow+1:inow+nvals);
% find max y value along the contour
[ymax, ind] = max(yvals);
xmax = xvals(ind);
maxpoints(end+1,:) = [xmax, ymax];
% increment index
inow = inow + nvals + 1;
end
% filter points as necessary
inds = maxpoints(:,1) > 0; % contours to the right
keeppoints = maxpoints(inds,:);
% plot them
hold on;
plot(keeppoints(:,1),keeppoints(:,2),'o-');
我们构建的maxpoints
数组的大小为[ncontours, 2]
,并包含“最大”点的坐标。如果您只想使用一些可见轮廓,则需要过滤它们。结果如下:
如您所见,线条的精度仅与轮廓线本身的精度一样好。您可以通过使数据更密集从而使轮廓线更平滑来提高准确性。上面带有0.02
步骤,而不是0.2
调用中的meshgrid
: