У меня проблема с гистограммой с накоплением. Пожалуйста, смотрите мой текущий код ниже. У меня 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;