Две разные цветовые карты с помощью команды patch - Matlab - PullRequest
1 голос
/ 16 апреля 2019

Как я могу создать две разные карты цветов для следующих patch

N=120;   
ids = (1:N/2)';
faces = [ids, ids+1, N-ids, N-ids+1];
c = exp(-6*cos(theta))';
c2 = exp(-6*cos(pi/2-theta))'; 
theta = linspace(0,2*pi,N+1); theta(end) = [];
figure
hold on
patch('Faces', faces, 'Vertices',[cos(theta);sin(theta)]','FaceVertexCData',c, 'FaceColor', 'interp', 'EdgeColor', 'none')
patch('Faces', 1:120, 'Vertices',1.01*[cos(theta);sin(theta)]','FaceVertexCData',c2, 'FaceColor', 'none', 'EdgeColor', 'interp','linewidth',5)
axis equal

Идея состоит в том, что каждый патч будет иметь свою карту цветов (также с цветными полосами)

enter image description here

1 Ответ

1 голос
/ 16 апреля 2019

Вы можете использовать несколько цветовых карт на одной оси, сложив их вместе:

cmapsize = 64;
colormap( [parula(cmapsize); jet(cmapsize)] );

Затем вы можете установить свойство CDATA для каждого графика:

c1 = 1:cmapsize; %this uses the first colormap.
c2 = cmapsize+1 : cmapsize*2; % this uses the second colormap.

В вашем случаевам просто нужно масштабировать CDATA, чтобы CDATA для первого графика находился в диапазоне [1, cmapsize], а для другого [cmapsize+1, cmapsize*2]:

c = normalize(exp(-6*cos(theta)),'range')' * cmapsize;
c2 = normalize(exp(-6*cos(pi/2-theta)),'range')' * cmapsize + cmapsize + 1;

Полный код:

N=120;   
cmapsize = 64;

ids = (1:N/2)';

theta = linspace(0,2*pi,N+1); theta(end) = [];
faces = [ids, ids+1, N-ids, N-ids+1];
c = normalize(exp(-6*cos(theta)),'range')' * cmapsize;
c2 = normalize(exp(-6*cos(pi/2-theta)),'range')' * cmapsize + cmapsize + 1;

figure('colormap', [parula(cmapsize);jet(cmapsize)]);
hold on
patch('Faces', faces, 'Vertices',[cos(theta);sin(theta)]','FaceVertexCData',c, 'FaceColor', 'interp', 'EdgeColor', 'none')
patch('Faces', 1:120, 'Vertices',1.01*[cos(theta);sin(theta)]','FaceVertexCData',c2, 'FaceColor', 'none', 'EdgeColor', 'interp','linewidth',5)
axis equal

enter image description here


Colorbar

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

spacer = 10;
figure('colormap', [parula(cmapsize); ones(spacer,3); jet(cmapsize)]);

и настроить метки и метки:

f = colorbar;
ticks = linspace(0,cmapsize,5);
f.Ticks = [ticks, ticks + cmapsize + spacer + 1];
f.TickLabels = compose('%d',ticks); % or whatever your tick labels are.

Вытакже необходимо изменить CDATA для второго графика, чтобы избежать использования области прокладки:

c2 = normalize(exp(-6*cos(pi/2-theta)),'range')' * cmapsize + cmapsize + 1 + spacer;

Вот что вы можете получить с помощью этого метода:

enter image description here

Если это недостаточно для вас, вы можете рассмотреть возможность наложения одной оси поверх другой, как это предлагается в комментарии @ Hoki ( Несколько цветовых карт на одной оси ).

...