Как наложить две контурные карты друг на друга в Matlab? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть две контурные карты в Matlab, и каждая из двух карт имеет одну кривую, указывающую одно Z-значение. Я хочу наложить две контурные карты так, чтобы я мог найти единственное решение, где две кривые z-значения пересекаются. Как я могу сделать супер наложение двух контурных карт?

 % the two contour maps are coded the exact same way, but with different z-values
 x = 0.05:0.05:1;
 y = 0.0:0.05:1;
 [X, Y] = meshgrid(x, y);
 % Z-value data is copied from excel and pasted into an array
 Z = [data]
 contourf(X, Y, Z);
 pcolor(X, Y, Z); hold on
 shading interp
 title();
 xlabel();
 ylabel();
 colorbar

 val = %z-value to plot onto colormap
 tol = %tolerance
 idxZval = (Z <= val+tol) & (Z >= val-tol);
 plot(X(idxZval), Y(idxZval))[enter image description here][1]

1 Ответ

2 голосов
/ 12 июля 2019

Конечный результат, который вы ищете, возможен с помощью contourc или с помощью contour с указанием одинаковых контуров (изолиний).

Этот ответ расширяет этот ответ в Подход 1 с использованием contourc и предоставляет простое решение с contour в Подход 2 .

Вы можете спросить " Почему Подход 1, когда Подход 2 такой простой? " Подход 1 предоставляет способ прямого доступа к отдельным изолиниям, если вам требуется численный подход к поиску пересечений.

Подход 1

Пример данных:

% MATLAB R2018b
x = 0:0.01:1;
y = 0:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^3+Y);                      % Placeholder 1
W = sqrt(X.*Y + X.^2 + Y.^(2/3));      % Placeholder 2

Наложение одиночной изолинии из 2 контуров
Подражая этот ответ и используя
v = [.5 0.75 .85 1]; % Values of Z to plot isolines
мы можем визуализировать эти две функции Z и W соответственно.

Two contour plots

Мы можем наложить изолинии, так как они разделяют один и тот же домен (x, y) . Например, они оба равны 0,8 , как показано ниже.

Overlay of isolines for Z, W, for value of 0.8

val = 0.8;                     % Isoline value to plot (for Z & W)
Ck = contourc(x,y,Z,[val val]);
Ck2 = contourc(x,y,W,[val val]);
figure, hold on, box on
plot(Ck(1,2:end),Ck(2,2:end),'k-','LineWidth',2,'DisplayName',['Z = ' num2str(val)])
plot(Ck2(1,2:end),Ck2(2,2:end),'b-','LineWidth',2,'DisplayName',['W = ' num2str(val)])
legend('show')

Наложение нескольких изолиний с двух контуров
Мы также можем сделать это для большего количества изолиний за один раз.
Overlay of multiple isolines

v = [1 0.5];                   % Isoline values to plot (for Z & W)
figure, hold on, box on
for k = 1:length(v)
   Ck = contourc(x,y,Z,[v(k) v(k)]);
   Ck2 = contourc(x,y,W,[v(k) v(k)]);
   p(k) = plot(Ck(1,2:end),Ck(2,2:end),'k-','LineWidth',2,'DisplayName',['Z = ' num2str(v(k))]);
   p2(k) = plot(Ck2(1,2:end),Ck2(2,2:end),'b-','LineWidth',2,'DisplayName',['W = ' num2str(v(k))]);
end
p(2).LineStyle = '--';
p2(2).LineStyle = '--';
legend('show')

Подход 2

Не делая это красиво ...

% Single Isoline
val = 1.2;
contour(X,Y,Z,val), hold on
contour(X,Y,W,val)


% Multiple Isolines
v = [.5 0.75 .85 1];
contour(X,Y,Z,v), hold on
contour(X,Y,W,v)

Это просто, чтобы очистить их для представления. Если val является скаляром (одно число), то c1 = contour(X,Y,Z,val); и c2 = contour(X,Y,W,val) дают доступ к изолинии для каждого контурного графика.

...