Гистограмма переключения цветов в Matlab - PullRequest
0 голосов
/ 07 января 2019

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

«Итого EON до разделения» с «Итого EON после разделения»

'Pre-split pure EON' с 'Post split split EON'

'RWE итогового разделения' с 'RWE итогового разделения'

'Pre-split pure RWE' с 'Post split pure RWE'.

Это все, но я не знаю, как это сделать, поскольку цвета назначаются автоматически ...

clear all
close all

values = [4 1 11 2 3; 4 1 5 2 -10];
names = {'Pre split total EON' 'Post split total EON'...
    'Pre split pure EON' 'Post split pure EON' 'Post split Uniper';...
    'Pre split total RWE' 'Post split total RWE'...
    'Pre split pure RWE' 'Post split pure RWE' 'PostSplitInnogy'};
categories = {'EON','RWE'};
figure;
b = bar(values,'FaceColor','flat');
ticksList = b(1).XData+arrayfun(@(x)x.XOffset, b)';
xticks(ticksList(:))
xticklabels([names(1,:)';names(2,:)'])
xtickangle(90)
ax1 = gca;
ax2 = axes('Position', get(ax1, 'Position'),'Color', 'none');
set(ax2, 'XAxisLocation', 'top','YAxisLocation','Right');
set(ax2, 'XLim', get(ax1, 'XLim'),'YLim', get(ax1, 'YLim'));
set(ax2, 'YTick', []);
xticks(b(1).XData)
xticklabels(categories)
for k = 1:size(values,2) % for fancier colors.
    b(k).CData = k;
end

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я знаю, что @Finn уже ответил на это, но когда я тестировал его решение, я не мог заставить его работать. Странно, но я понял, что даже оригинальный скрипт давал ошибки в моей системе. Возможно, у меня есть очень древняя версия MATLAB. Но опять же, мне интересно, если у кого-то еще есть проблема.

По какой-то причине я не могу установить член CData для bar.

В любом случае, после тестирования у меня это сработало.

clc
clear all
close all

values = [4 1 11 2 3; 4 1 5 2 -10];
names = {'Pre split total EON' 'Post split total EON'...
    'Pre split pure EON' 'Post split pure EON' 'Post split Uniper';...
    'Pre split total RWE' 'Post split total RWE'...
    'Pre split pure RWE' 'Post split pure RWE' 'PostSplitInnogy'};
categories = {'EON','RWE'};
figure;
b = bar(values,'FaceColor','flat');

% only significant changes here
% ***********************************
col = ["r", "b", "y", "g", "cyan"];
for k = 1:size(values,2) % for fancier colors.
    set(b(k), "FaceColor", col(k));
end
% ***********************************

ticksList = b(1).XData + arrayfun(@(x)x.XOffset, b)';
xticks(ticksList(:))
xticklabels([names(1,:)';names(2,:)'])
xtickangle(90)
ax1 = gca;
ax2 = axes('Position', get(ax1, 'Position'),'Color', 'none');
set(ax2, 'XAxisLocation', 'top','YAxisLocation','Right');
set(ax2, 'XLim', get(ax1, 'XLim'),'YLim', get(ax1, 'YLim'));
set(ax2, 'YTick', []);
xticks(b(1).XData)
xticklabels(categories)

Если вы хотите узнать больше о том, как назначаются имена цветов в MATLAB, отметьте здесь .

Еще одна вещь, с которой вы можете поиграть, это установить colormap как объяснено здесь .

0 голосов
/ 07 января 2019

Я чувствую, что вы назначили цвета вручную в:

for k = 1:size(values,2) % for fancier colors.
    b(k).CData = k;
end

Если вы просто хотите изменить порядок, вы можете сделать это с помощью

b(1).Cdata = 2;

и так далее. В качестве альтернативы вы можете изменить все в одном с

[b.CData] = deal(2,1,4,3,5);
...