Соединить экстремальные точки контурных линий - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь отметить и соединить максимальные точки на контурном графике в 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')

Это дает кривые контура ниже,и черная линия и красные круги - это то, что я хотел бы построить.

contour plot with max points

Я пытался найти индексы максимальных значений для каждой строкив Z, затем нанесение соответствующих значений X и Y.Это не дало мне правильные значения в моей исходной задаче.

Я ищу, есть ли способ автоматического извлечения этих значений из фигуры / данных.

1 Ответ

0 голосов
/ 17 октября 2018

Данные для контурных линий могут быть извлечены из вызова на contour.Первое возвращаемое значение - это матрица контуров , которую можно проанализировать, чтобы получить точки каждой каждой линии контура.Тогда это просто вопрос логистики, чтобы найти «максимальную» точку, которую вы действительно представляете как точку вдоль контура с наибольшим значением 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] и содержит координаты «максимальных» точек.Вам необходимо отфильтровать их, если вы хотите работать только с некоторыми видимыми контурами.Вот результат:

resulting figure with

Как видите, точность линии не уступает точности самих линий контура.Вы можете повысить точность, сделав ваши данные более плотными и, следовательно, ваши контурные линии более гладкими.Выше с шагом 0.02 вместо 0.2 в вызове meshgrid:

result with nice and smooth resolution

...