首页 > 解决方案 > Matlab中具有负值和正值的条形图

问题描述

我正在使用 Matlab 2019a,我想在 x 轴下方绘制正向量和负向量、正向量和负向量。以下代码工作正常,除了...

a) 颜色和图例。我希望每个收入和运营支出向量都有相同的颜色和相应的图例条目。

b)我希望那些大部分为负的向量(在本例中为 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;

标签: matlabplotbar-chartlegend

解决方案


您可以通过存储条形图的句柄并单独设置颜色来实现 (a)。

我将 (b) 解释为您想根据系列的平均值对堆栈顺序进行排序。

下面的代码可以扩展到更多的数据系列。您需要为 的每个元素提供一个标签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;

推荐阅读