文件交换

图片缩略图

堆叠条形图组

版本1.0.0.0 (1.69 KB 埃文
生成一个条形图,其中包含分组的多个堆栈。
4.9
53评级

89下载

更新2011年9月13日

查看许可协议

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

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

引用作为

埃文(2021)。堆叠条形图组(//www.tianjin-qmedu.com/matlabcentral/fileexchange/32884-plot-groups-of-stacked-bars), MATLAB中央文件交换。检索

评论及评分(65

罗德里戈Bezerra

伟大的工作。完美的工作。

Dilini Wickrama Achchige

海滨妞妞

好了!谢谢你!

克里斯蒂Etukudor

仍然很相关;谢谢你!

Loughlin先生达德利

爱莉Gajetti

迪Oms

谢谢你工作棒极了!!

Vasia Papoutsaki

谢谢你!

票面价值

亚当Danz

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

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

汉诺Teiwes

张濛

一旦绘制了数据,就可以很容易地使用“编辑”中的“图属性”自定义图形。例如,颜色、名称或比例(线性或对数)。

陆小曼

非常感谢!

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'};)
% %
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)* groupOffset + 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

嗨,想添加传奇。剧情如预期的那样运作。

看看Beckah Rieck在16年7月12日的帖子,第一步是创建一个句柄但是……

数据
Z(:,:,1) = [EnCol'*2, EnAddDiurn'];
Z(:,:,2) = [zero (12,1), EnAddSeas'];
(所有的变量都是12x1的双倍,你可以从0的值看到)

命令创建句柄
b = plotBarStackGroups(Z, months);

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

你知道我做错了什么吗?
提前谢谢!

亚历山大Kurz

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

regaieg rym

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

Suehee啊

谢谢! !

Beckah Rieck

谢谢埃文!

Emma-如果你说的是每个条的x标签,只需要添加一个图例:
b = plotBarStackGroups(stackData, Month);
legend([b(1,1), b(2,1), b(2,2)], 'Total Added', '关闭-非快速点击','关闭-快速点击');

如果你指的是栏上的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

很好。

珍妮

维拉

里卡多

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

蒂姆

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

在这之后……
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 = {'Test';2;4;6;8;1;};
stackData =兰德(NumGroupsPerAxis NumStacksPerGroup NumStackElements);

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

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

社区寻宝

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

开始狩猎!