Спасибо @ Cris Luengo за его комментарии, направляющие меня к contourc
. Обратите внимание, что contourc
возвращает изолинии. Согласно документации,
Чтобы вычислить один контур уровня k
, используйте contourc(Z,[k k])
, что означает, что мы можем идентифицировать конкретные значения для изолиний (значения Z
) с помощью
v = [.5 0.75 .85];
а затем просто используйте цикл для итеративного получения необходимой информации, используя
for k = 1:length(v)
Ck = contourc(x,y,Z,[v(k) v(k)]);`
end
, что позволяет нам передавать информацию в plot(...)
в коде ниже.
![Drawing Isolines with contourc](https://i.stack.imgur.com/kuBKP.jpg)
% MATLAB R2018b
x = 0:0.01:1;
y = 0:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^3+Y); % Placeholder
v = [.5 0.75 .85]; % Values of Z to plot isolines
figure, hold on
pcolor(X, Y, Z);
shading interp
colorbar
for k = 1:length(v)
Ck = contourc(x,y,Z,[v(k) v(k)]);
plot(Ck(1,2:end),Ck(2,2:end),'k-','LineWidth',2)
end
Старый, но работает: удалит один раз выше завершенный ответ
Отказ от ответственности: Возможно, существует более простой способ сделать это. Смотрите примечание внизу.
x = 0:0.01:1;
y = 0:0.01:1;
[X,Y] = meshgrid(x,y);
Z = sqrt(X.^3+Y); % Placeholder
Команда plot
может перекрывать все, что вы хотите сверху. Или вы можете использовать contourf
и указать отмеченные контуры, включая выделение отдельных контуров . Я проиллюстрировал два подхода - я полагаю, что тот, который вы ищете, использует hold on; plot(...)
, как показано ниже, и с left image.
На левом рисунке вы увидите, что я использовал логическое индексирование.
val = 0.75; % Value of Z to plot contour for
tol = .002; % numerical tolerance
idxZval = (Z <= val+tol) & (Z >= val-tol);
Успех этого подхода во многом зависит от того, насколько точна сетка на Z
и от требуемого допуска (tol
). Если сетка Z ограничена данными, то вам придется настроить допуск и настроить его по своему вкусу или на ограничение ваших данных. Я просто подстраивался, пока не получил рисунок ниже, и больше не повозился.
![(Left) My bootleg approach. (Right) Using built-in functionality.](https://i.stack.imgur.com/2Hsxx.jpg)
% MATLAB 2018b
figure
subplot(1,2,1) % LEFT
pcolor(X, Y, Z); hold on
shading interp
xlabel('X')
ylabel('Y')
colorbar
val = 0.75; % Value of Z to plot contour for
tol = .002; % numerical tolerance
idxZval = (Z <= val+tol) & (Z >= val-tol);
plot(X(idxZval),Y(idxZval),'k-','LineWidth',2)
title('Bootleg approach for Z = 0.75')
subplot(1,2,2) % RIGHT
v =[0:.1:1.2] % values of Z to plot as contours
contourf(X,Y,Z,v)
colorbar
title('Contour plot specifying values v =[0:.1:1.2]')
Edit:
Для будущих посетителей , если известны отношения между X
, Y
и Z
, например, sqrt(X.^3 + Y) = Z
, затем построение одной кривой для конкретного значения Z
может быть извлечено из этого отношения (уравнения) непосредственно путем решения уравнения. Если он основан на данных, а не на аналитической формуле, то это может быть более сложным, и подход, описанный выше, может быть проще (спасибо @ Cris Luengo за то, что указал на это в комментариях).