【问题标题】:Bar plot with negative and positive values in MatlabMatlab中具有负值和正值的条形图
【发布时间】:2019-11-04 08:51:15
【问题描述】:

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

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

b) 我想让那些大部分为负的向量(在本例中为 opex)在它们为正时比那些大部分为正的向量(在本例中为收入)更靠近 x 轴。 IE。在情节的积极部分,收入总是高于运营支出。

我想以一种有效的方式编写它,以便我可以将它推广到更多向量。谢谢!

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;

【问题讨论】:

    标签: matlab plot bar-chart legend


    【解决方案1】:

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

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

    下面的代码可以扩展到更多的数据系列。您需要为data 的每个元素提供一个标签。颜色来自parula 颜色图。 (如果您愿意,可以选择 jet 之类的其他内容。)

    [根据 cmets 编辑:]

    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;
    

    【讨论】:

    • 谢谢,看起来不错!但是,我认为您必须切换上升和下降,对吗?另外,我想按向量为正的相对次数排序,而不是按平均值排序。还有很多向量的问题:我不想手动分配颜色,我也不想要任何颜色重复......
    • 您可以使用内置颜色图之一来分配颜色,或者只使用 rand 来选择它们。要按正数排序,请将 mean(data{i}) 替换为 nnz(dataPos{i})。
    • 您能否建议一个新代码,然后我可以接受您的回答。
    • 谢谢,我一直在旅行,但我明天会测试新代码并接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2016-11-11
    相关资源
    最近更新 更多