';累计';MATLAB中的条形图

';累计';MATLAB中的条形图,matlab,Matlab,我试图在一个图中绘制5个直方图。为了使其可读性,我曾想过使用“累积”(不确定这是否是正确的术语)条形图,但在MATLAB中找不到一个简单的实现。有吗 下面是我所说的一个例子: a=1:5 b=5:-1:1 当我尝试使用普通条形图时,它会如下所示: bar([a ;b]') 我想要的是(请原谅仓促的图像编辑): 我不能用“保持”两次使用“条形图”,因为其中一个条形图将覆盖另一个条形图 ps:如果有更好的方法在绘图上绘制多个直方图,除了使用密度曲线,请随时提出建议:)我相信您可能正在寻找:

我试图在一个图中绘制5个直方图。为了使其可读性,我曾想过使用“累积”(不确定这是否是正确的术语)条形图,但在MATLAB中找不到一个简单的实现。有吗

下面是我所说的一个例子:

a=1:5
b=5:-1:1
当我尝试使用普通条形图时,它会如下所示:

bar([a ;b]')

我想要的是(请原谅仓促的图像编辑):

我不能用“保持”两次使用“条形图”,因为其中一个条形图将覆盖另一个条形图


ps:如果有更好的方法在绘图上绘制多个直方图,除了使用密度曲线,请随时提出建议:)

我相信您可能正在寻找:

bar([a ;b]', 'stacked')
==编辑1===

更仔细地观察您的图形,您可能也在寻找一种不太传统的“堆叠”,您可以通过叠加两个条来实现,如下所示:

a=(1:5)';
b=(5:-1:1)';
c = a;
c(b<=a)=nan;
figure;
subplot(1,2,1);
bar([a,b]);
subplot(1,2,2);
hold on;
bar(a,'b');
bar(b,'r');
bar(c,'b');
hold off


===编辑2结束==

不完全是这样,“堆叠”选项将堆叠它们(因此在条形图中,在我的示例中,所有条形图的高度将为6)。然而,我正在寻找一个累积选项。刚刚看到你的评论后张贴我的编辑。我的编辑回答了你的问题吗?基本上,在这种情况下,“前”色始终是值最低的颜色。@rayryeng,我不同意这是重复的,至少不是你提供的答案:在你提供的答案中,矩阵是从最小到最大排列的,这使得叠加变得不那么复杂。在OP的例子中,一种规避这种情况的方法是添加第三个条件层,这就是我所建议的。谢谢,编辑实际上为2个数组的情况提供了一个解决方案,但在我的实际问题中,我有5个数组,这将使此方法相当复杂,我认为…你基本上想要在彼此的顶部绘制条形图,但让更大的酒吧脱颖而出。参考副本。如前所述,副本情况更简单,因为其中的值总是有序的。在这里,我不能简单地将这些条绘制在彼此的顶部,因为如果它们的值较高,我稍后绘制的条将覆盖我之前绘制的条。从这个意义上说,下面提供的答案是针对2个数组的情况的解决方案,但在我的实际问题中,我有5个数组,我认为这将使这个方法变得相当复杂。@rayryeng您可能想看一看。@Lucastzesniewski谢谢。我将重新开始这个问题。
function testBarOverlay()
    % data initialization
    nbSeries = 8;
    nbBars = 5;
    xt = 1:nbBars;
    data = rand( nbBars, nbSeries );

    %draw (then erase) figure and get the characteristics of Matlab bars (axis, colors...)
    figure;
    h = bar( data( :, 1 ) );
    width = get( h, 'barWidth' );
    delete( h );

    % sort in order to start painting the tallest bars
    [ sdata, idx ] = sort( data, 2 );

    % get the vertices of the different "bars", drawn as polygons
    x = [ kron( xt, [1;1] ) - width / 2; kron( xt, [1;1] ) + width / 2 ];

    % paint each layer, starting with the 'tallest' ones first
    for i = nbSeries : -1 : 1
        y = [ zeros( nbBars, 1 ), sdata( :, i ), sdata( :, i ), zeros( nbBars, 1 ) ]';
        p = patch( x, y, 'b' );
        set( p, 'FaceColor', 'Flat', 'CData', idx( :, i )' );
    end
end