Как я могу нанести одну двумерную кривую на карту цветов в Matlab? - PullRequest
0 голосов
/ 26 июня 2019

Я создал двухмерный контурный график с плавным цветовым градиентом с существующими скомпилированными данными в Matlab. У меня есть контур по осям X, Y и Z в виде цветовой карты. Моя цель - построить двухмерную кривую на карте цветов, представляющую одно значение z-данных, но я не знаю как. Кто-нибудь знает, как построить 2-D кривую на 3-D цветовую карту? Я предоставил ссылку на текущую цветовую карту, на которой я хочу построить одно z-значение в виде кривой. Существующая цветовая карта

x = 0.05:0.05:1;
y = 0.0:0.05:1;
[X, Y] = meshgrid(x, y);
Z = [data]
contourf(X, Y, Z);
pcolor(X, Y, Z);
shading interp
title()
xlabel()
ylabel()
colorbar

1 Ответ

2 голосов
/ 28 июня 2019

Спасибо @ 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

% 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.

% 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 за то, что указал на это в комментариях).

...