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');