绘制一组堆叠的条形图,但根据所提供的标签对它们进行分组。
参数:
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中央文件交换。检索.
伟大的工作。完美的工作。
好了!谢谢你!
仍然很相关;谢谢你!
谢谢你工作棒极了!!
谢谢你!
应该将条的句柄作为输出添加,以便用户可以操作条参数。
下面是一个如何在每个堆栈中改变片段颜色的例子。
//www.tianjin-qmedu.com/matlabcentral/answers/371186-grouped-stacked-bar-with-specific-colours#answer_393160
一旦绘制了数据,就可以很容易地使用“编辑”中的“图属性”自定义图形。例如,颜色、名称或比例(线性或对数)。
非常感谢!
如何添加图例?非常感谢!我赶时间
如何工作?
谢谢你的贡献,很有用!
有用但是个问题。
如何增加x-tick标签(用于标记组)和x-tick标签(用于标记组的元素)之间的距离?
很好,非常有用。10倍。
谢谢!也为颜色编码提提!
每个栏的标签在顶部b/c,该文本的Y坐标设置为所有列的和。要在栏的下方(以及标记x轴的线的下方)进行标记,请将从第36行开始添加的代码更改为
j = 1: NumGroupsPerAxis
文本(groupDrawPos (j), 0,…
barLabels{},‘VerticalAlignment’,‘帽子’,……
“HorizontalAlignment”、“中心”);
结束
谢谢
在回应关于添加标签到单个条的多个评论时,它似乎总是显示在条的顶部,即使“底部”设置为“垂直对齐”-有什么原因吗?
如果在调用此函数之前用0填充数据,那么在for循环中添加以下行可以避免不必要的图例条目。
任何(Y, Y = Y (: 1));
完全工作了:),谢谢你的出色代码和分享。
谢谢,很有用。
谢谢,你能告诉我怎么做吗?
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);
结束
谢谢埃文!这是伟大的;-)我想知道是否有一种方法在y轴上有对数刻度?我的组是超级异构的,我想用对数(以10为底)在垂直方向上对10的幂进行绘制。多谢。
非常有用的功能!
为单个列的标签找到了一个解决方案:
添加一个单元格字符串数组作为输入:
barLabels ={‘column1name’,‘column2name等等…};
然后,在第36行,就在for循环的'end'之前添加以下行:
%栏标签
j = 1: NumGroupsPerAxis
文本(groupDrawPos (j),笔(Y (j:), 2),…
我barLabel{},“VerticalAlignment”、“底”,…
“HorizontalAlignment”、“中心”);
结束
谢谢,非常方便的功能!
嗨,想添加传奇。剧情如预期的那样运作。
看看Beckah Rieck在16年7月12日的帖子,第一步是创建一个句柄但是……
数据
Z(:,:,1) = [EnCol'*2, EnAddDiurn'];
Z(:,:,2) = [zero (12,1), EnAddSeas'];
(所有的变量都是12x1的双倍,你可以从0的值看到)
命令创建句柄
b = plotBarStackGroups(Z, months);
错误
错误使用plotBarStackGroups
输出参数太多。
你知道我做错了什么吗?
提前谢谢!
谢谢你,埃文!最后,我想绘制带有错误条的堆叠条组。有人做过吗?
嗨
我想用我自己的值生成stackData矩阵。什么好主意吗?
谢谢! !
谢谢埃文!
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);
(这就把他们放在了基地)。
谢谢你的剧本。我还想为组内的每个条添加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,:),“堆叠”)
工作得很好。非常感谢,埃文。
很好。
非常有用的功能!,谢谢!
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’);
...所以每个条的底部总是黄色的,等等。
我怀疑你一年后还会需要它,但对于像我这样的下一个新手来说,它可能会很有用。
谢谢你优雅而实用的功能,埃文。
谢谢,非常方便的功能!
请告知我们是否可以给不同的栈分配不同的颜色?
目前,所有的堆栈元素都有相同的颜色/类型。然而,我想知道是否有可能区分不同的堆栈?
好一个!作品!例子说明了一切!谢谢你!
使用示例:
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') %将网格线放在堆栈顶部