Две разные цветовые карты с использованием команды patch — Matlab

#matlab #matlab-figure

#matlab #matlab-рисунок

Вопрос:

Как я могу создать две разные цветовые карты для следующего 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
 

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

введите описание изображения здесь

Комментарии:

1. На этот вопрос в Matlab Central было дано несколько дидактических примеров: как мне использовать несколько цветовых карт на одном рисунке? . В этом другом примере используется классический «2 наложенных axes » для достижения того же результата: несколько цветовых карт на одной оси

Ответ №1:

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

 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
 

введите описание изображения здесь


Цветная панель

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

 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;
 

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

введите описание изображения здесь

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

Комментарии:

1. спасибо, как я могу отобразить две цветовые панели рядом друг с другом на одном графике?