Matlab Colormap & Caxis соответствия нелинейных графиков - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь привести свои данные в соответствие с опубликованной картой ниже (рисунок слева), но не могу определить правильный код для цветовой шкалы. Приращения являются нелинейными.

Вот соответствующий код, который у меня есть (он является частью очень большого кода для пространственного отображения, поэтому, к сожалению, невозможно сделать его воспроизводимым):

caxes.donatt = [0 2.5];
colormaps.donat = mf_colormap_cpt('BlWhRe', 8);
colormaps.donat(1:1,:)  = [0.00 0.00 0.50];
colormaps.donat(2:2,:)  = [0.00 0.50 1.00];
colormaps.donat(3:3,:)  = [0.67 0.90 0.93];
colormaps.donat(4:4,:)  = [1.00 1.00 1.00];
colormaps.donat(5:5,:)  = [1.00 0.87 0.68];
colormaps.donat(6:6,:)  = [0.98 0.67 0.38];
colormaps.donat(7:7,:)  = [1.00 0.40 0.10];
colormaps.donat(8:8,:)  = [1.00 0.00 0.00];

Вот изображение ожидаемого результата цветовой шкалы: ожидаемый результат

Вот мой текущий результат с использованием кода, показанного выше: текущий результат цветовой шкалы

1 Ответ

2 голосов
/ 25 марта 2019

Проблема здесь в том, что цветовая карта, которую вы пытаетесь имитировать, является нелинейной, но MATLAB отображает данные в цветовую карту линейным способом. Вы можете решить эту проблему, сначала связав данные с помощью histcounts, чтобы создать линейное отображение, а затем отрегулировав метки для меток цвета , чтобы сделать вашу линейную карту цветов нелинейной. Вот пример:

data = 2.5.*rand(200);         % Sample random data in the range [0 2.5]
edges = [0 0.5 0.75 0.9 1.1 1.25 1.5 2 2.5];  % Define edges of nonlinear map
imgMap = [0.00 0.00 0.50; ...  % Colormap colors
          0.00 0.50 1.00; ...
          0.67 0.90 0.93; ...
          1.00 1.00 1.00; ...
          1.00 0.87 0.68; ...
          0.98 0.67 0.38; ...
          1.00 0.40 0.10; ...
          1.00 0.00 0.00];

[~, ~, bin] = histcounts(data, edges);  % Bin the data according to the edges

image(bin);                  % Plot bin index, not the original data
colormap(imgMap);            % Add new colormap
hBar = colorbar;             % Add color bar
set(hBar, 'TickLabels', ...  % Modify color bar tick labels
    [{''}; cellstr(num2str(edges(2:(end-1)).', '%g')); {''}]);

А вот пример графика:

enter image description here

Обратите внимание, что если ваши данные содержат значения NaN, вы получите значение bin , равное 0, которое в приведенном выше примере будет сопоставлено с самым низким значением в карте цветов диапазон (который является первым элементом imgMap). Чтобы восстановить эти значения NaN, выполните следующие действия после объединения данных с histcounts:

bin(bin == 0) = nan;
...