Matlab bar: установить цвета с помощью colormap(jet) в зависимости от высоты полосы

У меня есть 4 разных группы из нескольких баров. Я хотел бы, чтобы для каждой группы, чтобы построить каждый бар с цветом, который является функцией его значения высоты (то есть значение соответствующего бара) с colormap(jet),

На данный момент я сделал:

h=bar(xpoints(1:4),bpcombined(1:4,:),'grouped','BarWidth',0.5);
colorbar;
colormap(jet); 

и я получаю следующую цифру:

Как вы можете видеть, для каждого бара его цвет не является функцией высоты: это просто последовательность разных цветов (цветовой карты струй), одинаковая для 4 групп.

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

ОБНОВЛЕНИЕ 1: я попробовал решение, предложенное @masei но я получаю следующую ошибку на Matlab 2016b:

No appropriate method, property, or field 'CData' for class 'matlab.graphics.chart.primitive.Bar'.

Error in test_plot_bar_color (line 17)
    b.CData(k,:) = y_color(k,:);

Я не знаю, как обойти эту ошибку.

@masei сказал мне, чтобы использоватьFaceColor'свойство, но я не знаю, как поместить его в этот сценарий.

Любая помощь приветствуется

ОБНОВЛЕНИЕ 2:

Я пытался применить предложение @marsei, то есть построите несколько раз участки группы бара (а остальные группы установлены в Nan), например так:

  1 clear;
  2 % Data
  3 y = rand(10,4);
  4 % 2D array of nan
  5 y_nan = nan(size(y))
  6 % 1D array by default
  7 y_1d(1:numel(y)) = nan(numel(y),1);
  8 
  9 %Plot
 10 figure('Color', 'w');
 11 title('Bar with height-dependant color');
 12 for k = 1:size(y,2)
 13     % Set default 1D array
 14     y_temp = y_1d;
 15     % Put k-th part of data
 16     y_temp((k-1)*size(y_nan,1)+1:k*size(y_nan,1)) = y(1:size(y_nan,1),k);
 17     % Reshape 1D into 2D for bar
 18     y_final = reshape(y_temp,size(y,2),size(y,1));
 19     % Plot bar
 20     bar_h = bar(y_final,'BarWidth',0.5);
 21     y_color = vals2colormap(y_final(k,:),'jet');
 22     %b.FaceColor = y_color(:,:);
 23     %y_color
 24     bar_child=get(bar_h,'Children');
 25     bar_child.FaceColor = y_color(:,:);
 26     %colormap(y_color);
 27     %set(bar_child,'CData',y_final);
 28     hold on;
 29 end
 30 

Но я получаю следующую ошибку:

Field assignment to a non-structure array object.

Error in test_plot_bar_color (line 25)
    bar_child.FaceColor = y_color(:,:);

Кто-нибудь мог понять, что не так на моем пути?

С уважением

1 ответ

РЕДАКТИРОВАТЬ - пример, который использует отсортированные данные (y = sort(rand(30,10),2) а также separation_gap = 5)


Вы можете использовать обычное свойство бара под названием CData назначить каждой полосе цвет. Цвет вычисляется с помощью vals2colormap ( веб).

Исходная матрица данных имеет 10 строк, что дает 10 групп баров в регулярном bar сюжет. На данный момент, изменение CData Свойство для первого бара меняет цвет всего первого бара (для всех групп). Вы не можете отделить первые бары.

Хитрость заключается в том, чтобы сгладить матрицу при вставке NaN для разделения групп. Здесь исходные данные 10x4 сплющить в 40 элементах вектора, разделенных одним Nan, Благодаря этому вы получаете полный контроль над каждым отдельным столбцом (столбцы больше не группируются).

Следующий график

производится

% data
y = rand(10,4);

% add NaNs (for separation) and flatten
separation_gap = 1; % 2 columns of NaN
y_nan = [y nan(size(y,1), separation_gap)]';
y_flat = [nan(separation_gap,1); y_nan(:)];

%convert values to colomap
y_color = vals2colormap(y_flat, 'jet');

%plot and cange color
figure('Color', 'w');
b = bar(y_flat);%,'grouped'
b.FaceColor = 'flat';
for k = 1:size(y_flat,1)
    b.CData(k,:) = y_color(k,:);
end

title('Bar with height-dependant color');
Другие вопросы по тегам