matlab - 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;
解决方案
您可以通过存储条形图的句柄并单独设置颜色来实现 (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;
推荐阅读
- node.js - 如何在 ExpressJS 中处理同步
- c++ - 样式检查:错误:左括号 '(' 之前需要空格
- caching - 我们可以同时在 CM 和 RAM 中托管多个程序的块吗?如果可以,哪个程序有助于区分不同程序的块
- kubernetes - 指定命名空间时,无法使用 nginx-stable 中的 helm 安装 nginx 入口
- html - 从 csv 读取多个数据
- bootstrap-4 - Boostrap4 轮播在过渡期间扩展
- c - if 条件中浮点数的二进制
- xpath - 如何使用 XPath 只返回数字
- javascript - 如何保存 Mongoose exec 函数的返回值?
- machine-learning - 验证错误没有改变但训练损失减少的可能原因是什么?