Гистограмма с отрицательными и положительными значениями в Matlab - PullRequest
0 голосов
/ 21 июня 2019

Я использую Matlab 2019a и хочу построить гистограмму положительных и отрицательных векторов, положительных выше и отрицательных векторов ниже оси x. Следующий код работает нормально, за исключением ...

а) цвета и легенды. Я хочу иметь одинаковые цвета и соответствующие записи легенды для каждого дохода и вектора операционных расходов.

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

Я хотел бы написать это эффективным способом, чтобы я мог обобщить его для большего числа векторов. Спасибо!

clc
clear
close all

revenue = ones(100,1);
opex = -1*ones(100,1);
opex(10:15,1) = 3;

revenueNeg = revenue;
revenueNeg(revenueNeg>0) = 0;
revenuePos = revenue;
revenuePos(revenuePos<0) = 0;
opexNeg = opex;
opexNeg(opexNeg>0) = 0;
opexPos = opex;
opexPos(opexPos<0) = 0;
yDataNeg = [revenueNeg, opexNeg];
yDataPos = [revenuePos, opexPos];
hold on;
bar(yDataNeg,'stack')
bar(yDataPos,'stack')
legend('Revenue','Opex');
hold off;

1 Ответ

1 голос
/ 22 июня 2019

Вы можете достичь (а), сохранив дескриптор гистограммы и задав индивидуальные цвета.

Я интерпретирую (б), что вы хотите отсортировать порядок стеков по среднему значениюзначение серии.

Приведенный ниже код может быть расширен до нескольких рядов данных.Вы захотите поставить метку для каждого элемента data.Цвета взяты из карты цветов parula.(Вы можете выбрать что-то еще, например jet, если хотите).

[Отредактировано в ответ на комментарии:]

data{1} = revenue;
data{2} = opex;
colors = parula(numel(data));
labels = {'Revenue','Opex'};
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) = nnz(dataPos{i});  % was: mean(data{i});
end;
[~,posOrder] = sort(mdata,'ascend');
[~,negOrder] = sort(mdata,'descend');
yDataPos = [dataPos{posOrder}];
yDataNeg = [dataNeg{negOrder}];
hold on;
bNeg = bar(yDataNeg,'stack');
bPos = bar(yDataPos,'stack');
for i= 1:numel(data)
    set(bNeg(i),'FaceColor',colors(negOrder(i),:))
    set(bPos(i),'FaceColor',colors(posOrder(i),:))
end;
legend(labels{:});
hold off;
...