绘制一组堆叠的条形图,但是根据提供的标签对它们进行分组。
参数:
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中央文件交换。检索。
好了!谢谢你!
仍然很相关;谢谢你!
谢谢你做得好!!
谢谢你!
工具条的句柄应该作为输出添加,以便用户可以操作工具条参数。
下面是一个如何在每个堆栈中改变段的颜色的例子。
//www.tatmou.com/matlabcentral/answers/371186-grouped-stacked-bar-with-specific-colours#answer_393160
一旦绘制了数据,就可以使用“edit”菜单中的“figure Properties”轻松定制图形。例如,颜色、名称或比例(线性或对数)。
非常感谢!
如何添加图例?非常感谢!我赶时间
如何工作?
谢谢你的贡献,很有用!
有用,但是个问题。
如何增加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'};)
%%
%% 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);
结束
谢谢埃文!这很好;-)我想知道是否有一种方法在y轴上有对数尺度?我的组是超级异构的,我想把它们画成对数(以10为底),在垂直方向上以10的幂为底。多谢。
非常有用的功能!
解决了个别栏目的标签问题:
添加一个字符串单元格数组作为输入:
barLabels ={‘column1name’,‘column2name等等…};
然后,在第36行,就在for循环的'end'之前添加以下几行:
%栏标签
j = 1: NumGroupsPerAxis
文本(groupDrawPos (j),笔(Y (j:), 2),…
我barLabel{},“VerticalAlignment”、“底”,…
“HorizontalAlignment”、“中心”);
结束
谢谢,非常方便的功能!
你好,我想加点传奇。Plot工作如预期,否则。
看看贝克·里克在16年7月12日的帖子,第一步是创造一个手柄,但是……
数据
Z(:,:,1) = [EnCol'*2, EnAddDiurn']; / /输入数据
Z(:,:,2) = [zeros(12,1), EnAddSeas'];
(所有的变量都是12x1的双精度,就像你可以看到的那样)
Cmd来创建句柄
b = plotBarStackGroups(Z,月);
错误
错误使用plotBarStackGroups
输出参数太多。
你看出来我哪里做错了吗?
提前谢谢!
谢谢你,埃文!最后,我想绘制一组带有误差条的堆叠条。有人之前做过吗?
嗨
我想通过我自己的值生成stackData矩阵。什么好主意吗?
谢谢! !
谢谢埃文!
艾玛-如果你是在说每条杠的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);
(把它们放在底部)。
谢谢你的剧本。我还想为组内的每个酒吧添加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,:),“堆叠”)
工作得很好。非常感谢,埃文。
很好。
非常有用的功能!,谢谢!
伯克,我也有同样的愿望,而且发现定制非常简单。
在这之后……
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 ={'测试';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') %将网格线放在堆栈的顶部