построение графика поверхности в двух цветах в зависимости от условия на оси z - PullRequest
0 голосов
/ 19 сентября 2019

z - это массив 200 * 200, и у меня есть график серфинга с использованием Matlab surf (x, y, z).Я пытаюсь построить график серфинга так, чтобы при z <10 он был синим, а при z> 10 - красным.На данный момент серфовый сюжет такой.Может кто-нибудь, пожалуйста, предложить способ сделать это в Matlab?

enter image description here

Ответы [ 3 ]

2 голосов
/ 20 сентября 2019

Одним из способов достижения этого (есть несколько способов) является использование пользовательского colormap: создайте цветовую карту только с тем цветом, который вы хотите отобразить на графике, а затем просто отрегулируйте уровни, чтобы средняя точка была равна Z=10.

В первой части кода показано, как создать свою собственную цветовую карту и применить ее:

Zt = 10 ;       % threshold level for Z
z  = peaks+Zt ; % dummy test data

% build a colormap with your 2 custom color
%     [%Red %green %blue]
cmap = [0.79 0.22 0.81   ; % some kind of purple
        0    0    1    ] ; % pure blue

surf(z) ;           % plot the surface
colormap(cmap) ;    % apply the custom colormap
hcb = colorbar ;

Это создает поверхность с двумя выбранными вами цветами: 2 color surface

Но подождите!Разделение не совсем на уровне Z=10.Нет проблем, если мы отрегулируем границы цветовой карты так, чтобы ваш пороговый уровень находился на уровне взрыва в середине, Matlab позаботится о том, чтобы настроить цвет для нас:

%% Now center the colormap boundaries around your threshold level
% get the minimum and maximum
zmax = ceil(  max(max(z)) ) ;
zmin = floor( min(min(z)) ) ;

span = max( [zmax-Zt, Zt-zmin] ) ;  % calculate the span each side of [Zt]
caxis([Zt-span , Zt+span]) ;        % center the colormap around [Zt]

Threshold adjusted

Последний бит кода выше позволяет определить равный интервал вокруг выбранного вами порогового уровня и принять во внимание содержание данных Z.Если вы заранее знаете пределы своих данных, вам не нужно делать расчеты.В приведенном выше примере я мог бы также просто использовать последнюю строку с некоторыми жестко закодированными значениями:

caxis([0 , 20]) ;

Пока интервал, который вы указываете для caxis, центрируется вокруг вашего порогового уровня, он будет работать.


Редактировать:

Чтобы управлять надписями цветовой шкалы, я обычно устанавливаю Ticks и TickLabels после colorbar (или * 1037)*) создано.Для этого вам понадобится дескриптор объекта colorbar.

Обратите внимание, что в приведенном выше коде я изменил последнюю строку первого блока кода .Я изменил colorbar на hcb=colorbar;.Таким образом, у нас есть дескриптор цветовой полосы, который позволяет нам устанавливать любой произвольный тик и связанную метку.

Самый простой способ получить ваш результат для этого конкретного примера:

hcb.Ticks      = [   5 , 10 , 15  ] ;
hcb.TickLabels = {'<10','10','>10'} ;

Однако, если вам нужно более общее решение, которое может работать с любым порогом Zt, вы можете использовать:

%% adjust colorbar labels
zl = caxis ;            % get the limits of the color scale
Zstr = num2str(Zt) ;    % get a string representing the threshold
hcb.Ticks      = [ (Zt+zl(1))/2 , Zt   , (zl(2)+Zt)/2  ] ;
hcb.TickLabels = { ['<' Zstr]   , Zstr ,  ['>' Zstr]   } ;

Для вашего примера оба варианта дают:

Final image

1 голос
/ 19 сентября 2019

Адаптировано из Ответы MATLAB

z = peaks+10; % sample data generated between 3.4 and 18.1
% Make colors be red above 10, and blue below 10.
redChannel = z > 10;
greenChannel = 0*z;
blueChannel = z < 10;
% Make the RGB image.
colors = double(cat(3, redChannel, greenChannel, blueChannel));
% Plot the surface with those colors.
surf(z, colors);
0 голосов
/ 19 сентября 2019

попробуйте

surf(x,y,z)
map = [0.0 0.0 1.0
       1.0 0.0 0.0];
colormap(map);
caxis([0 20]);
...