Сортировка и цвета в столбчатой ​​диаграмме с положительными и отрицательными значениями (Matlab) - PullRequest
0 голосов
/ 22 июня 2019

У меня проблема с гистограммой с накоплением. Пожалуйста, смотрите мой текущий код ниже. У меня 2 проблемы:

1) Я хочу упорядочить положительные и отрицательные данные следующим образом: положительные данные, которые чаще всего имеют положительные значения, наиболее близкие к оси x, отрицательные данные, которые чаще всего имеют отрицательные значения, также ближе к x- ось (конечно, выше и ниже оси х, как это делается в настоящее время). Текущая сортировка по среднему не достигает этого, и я считаю, что это также портит назначения легенд.

2) Мне бы хотелось иметь разные цвета для разных данных, чтобы легенда была полезной. Я также хочу назначить цвета автоматически, чтобы я мог использовать одну и ту же структуру кода для разных графиков. Пожалуйста, ознакомьтесь с приведенным ниже кодом для моей попытки сделать это, однако цвета темные и похожие, и поэтому их нелегко различить. «Другие» представляют разные данные, я просто устал придумывать имена.

Большое спасибо.

clc
clear

%% Datevector
datevector = {'08-Jul-2040',...
    '08-Aug-2040',...
    '08-Sep-2040',...
    '08-Oct-2040',...
    '08-Nov-2040',...
    '08-Dec-2040',...
    '08-Jan-2041',...
    '08-Feb-2041',...
    '08-Mar-2041',...
    '08-Apr-2041',...
    '08-May-2041',...
    '08-Jun-2041',...
    '08-Jul-2041',...
    '08-Aug-2041',...
    '08-Sep-2041',...
    '08-Oct-2041',...
    '08-Nov-2041',...
    '08-Dec-2041',...
    '08-Jan-2042',...
    '08-Feb-2042',...
    '08-Mar-2042',...
    '08-Apr-2042',...
    '08-May-2042',...
    '08-Jun-2042',...
    '08-Jul-2042',...
    '08-Aug-2042',...
    '08-Sep-2042'};

%% Cash flows
data{1} = -5*rand(27,1);
data{2} = -3*rand(27,1);
data{3} = -5*rand(27,1);
data{4} = 4*rand(27,1);
data{5} = 2*rand(27,1);
data{6} = 3*rand(27,1);
data{7} = 2*rand(27,1);
data{8} = 1*rand(27,1);
data{9} = 5*rand(27,1);
data{10} = 3*rand(27,1);
data{11} = 4*rand(27,1);
data{12} = 1*rand(27,1);
data{13} = 5*rand(27,1);
data{14} = 3*rand(27,1);
data{15} = 4*rand(27,1);
data{16} = 1*rand(27,1);
data{17} = 5*rand(27,1);
data{18} = 3*rand(27,1);
data{19} = 4*rand(27,1);
data{20} = 1*rand(27,1);
data{21} = 5*rand(27,1);
data{22} = 3*rand(27,1);
data{23} = 4*rand(27,1);

labels = {'revenueFixed';...
'revenueMarket';...
'fullService';...
'partService';...
'lease';...
'techMgmt';...
'comMgmt';...
'guarantee';...
'decommission';...
'repowering';...
'taxAudit';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other';...
'other'};

colors = zeros(size(labels,1),3);
colors(1:7,:) = [1 1 0;...
1 0 1;...
0 1 1;...
1 0 0;...
0 1 0;...
0 0 1;...
1 1 1];

noAdditionalColors = size(labels,1)-7;
rounds = ceil(noAdditionalColors/7);
multiplier = 0.5.^(1:rounds);

for noRounds = 1:rounds-1
    for noColor = noRounds*7+1 : (noRounds+1)*7
        colors(noColor,:) = multiplier(noRounds) .* colors(noColor-noRounds*7,:);
    end
end

for noRounds = rounds
    for noColor = rounds*7+1 : rounds*7 + rem(noAdditionalColors,7)
        colors(noColor,:) = multiplier(noRounds) .* colors(noColor-noRounds*7,:);
    end
end

xData = datenum(datevector,'dd-mmm-yyyy');
for i = 1:numel(data)
    dataNeg{i} = data{i};
    dataNeg{i}(data{i}>0) = 0;
    dataPos{i} = data{i};
    dataPos{i}(data{i}<0) = 0;
    mdata(i) = mean(data{i});
end
[~,posOrder] = sort(mdata,'ascend');
[~,negOrder] = sort(mdata,'descend');
yDataPos = [dataPos{posOrder}];
yDataNeg = [dataNeg{negOrder}];
hold on;
bNeg = bar(xData,yDataNeg,'stack');
bPos = bar(xData,yDataPos,'stack');
datetick('x','yyyy','keeplimits');
for i= 1:numel(data)
    set(bNeg(i),'FaceColor',colors(negOrder(i),:))
    set(bPos(i),'FaceColor',colors(posOrder(i),:))
end
legend(labels{:});
hold off;
...