Цветовая карта Matlab и caxis, соответствующие нелинейным графикам

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

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

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];

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

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


person gall    schedule 25.03.2019    source источник
comment
Возможно, связано: @gnovice предоставляет очень полезный ответ о цветных полосах   -  person SecretAgentMan    schedule 25.03.2019


Ответы (1)


Проблема здесь в том, что карта цветов, которую вы пытаетесь имитировать, нелинейна, но 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')); {''}]);

А вот пример сюжета:

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

Обратите внимание, что если ваши данные содержат значения NaN, вы получите < значение href="https://www.mathworks.com/help/matlab/ref/histcounts.html#buijikm-1-bin" rel="nofollow noreferrer">bin, равное 0, что в приведенном выше example будет сопоставлен с наименьшим значением в диапазоне цветовой карты (который является первым элементом imgMap). Чтобы восстановить эти значения NaN, выполните следующие действия после бинирования данных с помощью histcounts:

bin(bin == 0) = nan;
person gnovice    schedule 25.03.2019
comment
привет, так что это сработало отлично, но проблема теперь в том, что мои данные имеют NaN (где не наблюдались температуры), которые должны быть серыми, как вы видите в моей предыдущей ссылке «текущий результат цветовой полосы». Но теперь, как только я соберу эти значения, они станут нулевыми, и если я заблокирую все нули, это просто здорово. Я постараюсь написать это правильно ниже. если у вас есть какие-либо предложения, которые были бы фантастическими - person gall; 01.04.2019
comment
@gall: отредактировано, чтобы упомянуть, как бороться с NaNs. - person gnovice; 01.04.2019