Matlab绘制分组箱线图的最有效方法

10
我有三个向量:Y=rand(1000,1)X=Y-rand(1000,1)ACTid=randi(6,1000,1)。 我想要按照Y和X的组值1-6(来自于ACTid)创建箱线图。
这有点特别而且看起来不太好。
for ii=
dummyY(ii)={Y(ACTid==ii)};
dummyX(ii)={X(ACTid==ii)}
end

现在我有一个单元格中的数据,但不知道如何将其分组到一个箱线图中。有什么想法吗?
我找到了一个名为aboxplot函数,看起来像这样,但我不想要那个,我想要内置的boxplot函数,因为我正在将它转换为matlab2tikz,而这个函数做得不好。 编辑 感谢Oleg:我们现在有了一个分组的箱线图...但标签都是歪的。
xylabel = repmat({'Bleh','Blah'},1000,1); % need a legend instead, but doesn't appear possible
boxplot([Y(:,end); cfu], {repmat(ACTid,2,1), xylabel(:)} ,'factorgap',10,'color','rk')
set(gca,'xtick',1.5:3.2:50)
set(gca,'xticklabel',{'Direct care','Housekeeping','Mealtimes','Medication','Miscellaneous','Personal care'})
>> ylabel('Raw CFU counts (Y)')

这里输入图片描述

如何添加图例?


我已经解决了异常值的问题,因为我正在使用 matlab2tikz,在那里我可以轻松地指定。图例也可以人为地放置,但这样做并不好玩 :S - HCAI
2个回答

10

我在制作箱线图时遇到了同样的问题。我的另一个限制是不同组具有不同数量的数据点。根据我找到的教程,这似乎是一个不错的解决方案,我想分享给你:

x = [1,2,3,4,5,1,2,3,4,6];
group = [1,1,2,2,2,3,3,3,4,4];
positions = [1 1.25 2 2.25];
boxplot(x,group, 'positions', positions);

set(gca,'xtick',[mean(positions(1:2)) mean(positions(3:4)) ])
set(gca,'xticklabel',{'Direct care','Housekeeping'})

color = ['c', 'y', 'c', 'y'];
h = findobj(gca,'Tag','Box');
for j=1:length(h)
   patch(get(h(j),'XData'),get(h(j),'YData'),color(j),'FaceAlpha',.5);
end

c = get(gca, 'Children');

hleg1 = legend(c(1:2), 'Feature1', 'Feature2' );

不同组大小的彩色分组箱线图

这里是教程的链接。


1
看起来句柄是从后往前返回的,所以为了与“颜色”映射的顺序从左到右匹配,我只需将“for”循环更改为“patch(get(h(j),'XData'),get(h(j),'YData'),color(length(h)-j+1),'FaceAlpha',.5);”。 - George Aprilis

9

一个两行的做法(虽然如果你想保留两行的 xlables 并将其居中在第一行,这可能会是一个笨拙的方式):

Y     = rand(1000,1);
X     = Y-rand(1000,1);
ACTid = randi(6,1000,1);

xylabel = repmat('xy',1000,1);
boxplot([X; Y], {repmat(ACTid,2,1), xylabel(:)} ,'factorgap',10)

结果: enter image description here 编辑:
要居中标签...
% Retrieve handles to text labels
h = allchild(findall(gca,'type','hggroup'));

% Delete x, y labels
throw = findobj(h,'string','x','-or','string','y');
h     = setdiff(h,throw);
delete(throw);

% Center labels
mylbl  = {'this','is','a','pain','in...','guess!'};
hlbl   = findall(h,'type','text');
pos    = cell2mat(get(hlbl,'pos'));

% New centered position for first intra-group label
newPos = num2cell([mean(reshape(pos(:,1),2,[]))' pos(1:2:end,2:end)],2);
set(hlbl(1:2:end),{'pos'},newPos,{'string'},mylbl')

% delete second intra-group label
delete(hlbl(2:2:end))

导出为 .png 格式会导致问题...

您可以添加 colorgroupcolors 参数来通过颜色区分组。 - yuk
非常感谢这个!我有两个小问题:我希望每个组都被称为不同的名称,例如1=直接护理,2=家政,3=进餐时间....而且,在x、y组标签的位置,可以添加一个颜色图例 boxplot([Y; X], {repmat(ACTid,2,1), xylabel(:)} ,'factorgap',10,'color','rk')。@yuk 颜色命令可以更改盒形图,但无法更改异常值,这也能更改吗? - HCAI
1
可以做到,但需要一些hackish的方法。例如,请参考这个问题:http://stackoverflow.com/questions/15125314/colorfill-the-boxes-in-a-boxplot-in-matlab。 - yuk
1
关于标签,使用 boxplot 中的 'labels' 参数。有关其他选项,请参阅文档 - yuk
@yuk 那传说呢?它似乎根本不起作用。 - HCAI
@OlegKomarov 非常感谢你们两位。我看到 Oleg 你在 Matlab Answers 上也很活跃 :)。不幸的是,我正在使用 matlab2tikz 导出到 LaTeX,但它无法正确捕捉组标签。我将坚持使用 set(gca,'xtick',1.5:3.2:50)和 set(gca,'xticklabel',{'Direct care','Housekeeping','Mealtimes','Medication','Miscellaneous','Personal care'})作为临时方法。 - HCAI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接