图片缩略图

划分堆叠的条块组

version 1.0.0.0 (1.69 KB) by 埃文
生成一个条形图,将多个堆栈分组在一起。
4.9
52评级

112下载

更新2011年9月13日

查看许可协议

绘制一组堆叠的条形图,但是根据提供的标签对它们进行分组。

参数:
stackData是一个3D矩阵(即,stackData(i, j, k) => (Group, Stack, StackElement))
groupLabels是一个CELL类型(例如,{'a', 1,20, 'foo'};)

引用作为

埃文(2021)。划分堆叠的条块组(//www.tatmou.com/matlabcentral/fileexchange/32884-plot-groups-of-stacked-bars), MATLAB中央文件交换。检索

意见及评分(64

Dilini Wickrama Achchige

海滨妞妞

好了!谢谢你!

克里斯蒂Etukudor

仍然很相关;谢谢你!

Loughlin先生达德利

爱莉Gajetti

迪Oms

谢谢你做得好!!

Vasia Papoutsaki

谢谢你!

票面价值

亚当Danz

工具条的句柄应该作为输出添加,以便用户可以操作工具条参数。
下面是一个如何在每个堆栈中改变段的颜色的例子。

//www.tatmou.com/matlabcentral/answers/371186-grouped-stacked-bar-with-specific-colours#answer_393160

汉诺Teiwes

张濛

一旦绘制了数据,就可以使用“edit”菜单中的“figure Properties”轻松定制图形。例如,颜色、名称或比例(线性或对数)。

陆小曼

非常感谢!

justok

玛丽娜Costantini

Qiquan张

如何添加图例?非常感谢!我赶时间

Qiquan张

如何工作?

Pushpa艺术观

谢谢你的贡献,很有用!

MatteP

有用,但是个问题。
如何增加x-tick标签(标记组)和x-tick标签(标记组的元素)之间的距离?

伊塔玛科恩

非常棒,非常有用。10倍。

玛莲Cobben

谢谢!还为颜色编码提姆!

亚历山德罗Rigazzi

katecl

单个栏的标签位于顶部。b/c该文本的Y坐标设置为所有列的和。要在条形图下面进行标记(在标记x轴的行下面),将从第36行开始的添加代码更改为

j = 1: NumGroupsPerAxis

文本(groupDrawPos (j), 0,…
barLabels{},‘VerticalAlignment’,‘帽子’,……
“HorizontalAlignment”、“中心”);

结束

xyzmrsir

谢谢

亚历山大Mangot

对于多个评论关于添加标签到单独的栏,它似乎标签总是显示在栏的顶部,即使“底部”被设置为“垂直对齐”-为什么?

如果在调用该函数之前用0填充数据,在for循环中添加以下行确实可以避免不必要的图例项。
任何(Y, Y = Y (: 1));

哈瑞Suryanarayana

CHENHAO王

Anjum劳夫米尔

Tasnuba西迪基

完全工作:),谢谢你的精彩编码和分享。

帕特丽夏Stahn

宝拉

谢谢,很有用。

Michail施瓦布

伊阿什拉夫

谢谢,请告诉我该怎么做:
i)如何增加工具条宽度似乎即使设置MaxGroupWidth = 1它也不会增加太多。
ii)如何将每个标签放在酒吧的中心。
谢谢。

易谷

添加栏标签,它工作
函数plotBarStackGroups (stackData groupLabels)
%%绘制一组堆叠的条形图,但是根据提供的标签对它们进行分组。
%%
% %参数:
%% stackData是一个3D矩阵(即,stackData(i, j, k) => (Group, Stack, StackElement))
%% groupLabels是一个CELL类型(例如,{'a', 1,20, 'because'};)
%%
%% Copyright 2011 Evan Bollig (Bollig at scs DOT fsu ANOTHERDOT edu .)
%%
%%

NumGroupsPerAxis = size(stackData, 1);
NumStacksPerGroup = size(stackData, 2);

%从桶的数量中计数
groupBins = 1: NumGroupsPerAxis;
MaxGroupWidth = 0.65;% 1的分数。如果是1,那么所有的棒子都是相互接触的
groupOffset = MaxGroupWidth / NumStacksPerGroup;
数字
抓住;
因为我= 1:NumStacksPerGroup

Y =挤压(stackData(:,我,:));

将条形图居中:

internalPosCount = i - ((NumStacksPerGroup+1) / 2);

偏移组绘制位置:
groupDrawPos(i,:) = (internalPosCount)* grouppoffset + groupBins;

h = bar(Y, 'stacked');
组(h,‘BarWidth’,groupOffset);
集(h, XData, groupDrawPos(我,:));
结束
barLabels = {' 2000 ', ' 2005 ', ' 2010 ', ' 2015 '};

%栏标签
j = 1: NumGroupsPerAxis
文本(groupDrawPos (:, j),挤压(总和(stackData (j,:,:), 3)),…
barLabels,“VerticalAlignment”、“底”,…
“HorizontalAlignment”、“中心”);
结束
推迟;
集(gca、“XTickMode”,“手册”);
集(gca, XTick, 1: NumGroupsPerAxis);
集(gca、“XTickLabelMode”,“手册”);
集(gca, XTickLabel, groupLabels);
结束

Reinhard Kreuzer

Kumush

谢谢埃文!这很好;-)我想知道是否有一种方法在y轴上有对数尺度?我的组是超级异构的,我想把它们画成对数(以10为底),在垂直方向上以10的幂为底。多谢。

Konstantinos Tsitsilonis

非常有用的功能!

解决了个别栏目的标签问题:

添加一个字符串单元格数组作为输入:

barLabels ={‘column1name’,‘column2name等等…};

然后,在第36行,就在for循环的'end'之前添加以下几行:

%栏标签
j = 1: NumGroupsPerAxis

文本(groupDrawPos (j),笔(Y (j:), 2),…
我barLabel{},“VerticalAlignment”、“底”,…
“HorizontalAlignment”、“中心”);

结束

y陈

谢谢,非常方便的功能!

尤妮斯李

ruffntuff

你好,我想加点传奇。Plot工作如预期,否则。

看看贝克·里克在16年7月12日的帖子,第一步是创造一个手柄,但是……

数据
Z(:,:,1) = [EnCol'*2, EnAddDiurn']; / /输入数据
Z(:,:,2) = [zeros(12,1), EnAddSeas'];
(所有的变量都是12x1的双精度,就像你可以看到的那样)

Cmd来创建句柄
b = plotBarStackGroups(Z,月);

错误
错误使用plotBarStackGroups
输出参数太多。

你看出来我哪里做错了吗?
提前谢谢!

亚历山大Kurz

谢谢你,埃文!最后,我想绘制一组带有误差条的堆叠条。有人之前做过吗?

regaieg rym

我想通过我自己的值生成stackData矩阵。什么好主意吗?

Suehee啊

谢谢! !

Beckah Rieck

谢谢埃文!

艾玛-如果你是在说每条杠的x标签,那就加个图例:
b = plotBarStackGroups(stackData, Month);
legend([b(1,1), b(2,1), b(2,2)], 'Total Added', 'Closed- Non Quick Hits', 'Closed- Quick Hits');

如果你指的是Y数据标签,请使用文本:
文本(b(1,1)。XData ', 0(大小(b (1,1) .XData ')), labelsAddedtoQ);

(把它们放在底部)。

Ashrar晨祷

艾玛约

谢谢你的剧本。我还想为组内的每个酒吧添加x标签,谁能帮我做到这一点?从例子中解释:在标签'Test'上面,我想在条形图上添加标签,例如:a' b' c'等等。

艾玛约

萨米

感谢这个脚本,如果你不喜欢情节的边界被打乱,只需删除第20行中的'hold on;'并添加'if I == 1, hold on;end' after 'h(i,:) = bar(Y, 'stacked');'!

谭余

伊丽莎白

奥列格•科马罗夫

如果你有一个3D数组a,那么重塑你的数组,并将数组与一排nan交错,将产生相同的结果:

深圳=大小(A);
B = [A, NaN(sz(1),1,sz(3))];
B =重塑(排列(B,(2, 1, 3)),深圳(1)*(深圳(2)+ 1),深圳(3));
酒吧(C (1: end-1,:),“堆叠”)

ADITHYAN

工作得很好。非常感谢,埃文。

丹尼尔Paiva

很好。

珍妮

维拉

里卡多

非常有用的功能!,谢谢!

蒂姆

伯克,我也有同样的愿望,而且发现定制非常简单。

在这之后……
h(i,:) = bar(Y, 'stacked');

我说这个……
集(h(我,1),‘facecolor’,‘y’,‘edgecolor’,‘k’);
集(h(我,2),‘facecolor’,‘r’,‘edgecolor’,‘k’);
集(h(我,3),“facecolor”、“c”,“edgecolor”,“k”);
集(h(我,4),‘facecolor’,‘g’,‘edgecolor’,‘k’);

...所以每条线的底部都是黄色的,等等。

我怀疑你一年后还会需要这个,但对下一个像我这样的新秀来说,可能会有用。

艾凡,谢谢你提供的优雅而有用的功能。

伯克

谢谢,非常方便的功能!

请问我们是否可以给不同的堆叠分配不同的颜色?
目前,所有的堆栈元素都有相同的颜色/类型。然而,我想知道是否有可能区分不同的堆栈?

伯克

grega

好一个!作品!例子说明得很清楚!谢谢你!

埃文

使用示例:

NumStacksPerGroup = 3;
NumGroupsPerAxis = 6;
NumStackElements = 4;

%标签用于标记组
groupLabels ={'测试';2;4;6;8;1;};
stackData =兰德(NumGroupsPerAxis NumStacksPerGroup NumStackElements);

plotBarStackGroups (stackData groupLabels);
集(gca、字形大小,18)
set(gcf,'Position',[100 100 720 650])
网格
set(gca,'Layer','top') %将网格线放在堆栈的顶部

MATLAB版本兼容性
创建R2008b
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!