单箱图用于多组比较

时间:2017-06-08 19:06:11

标签: matlab matlab-figure boxplot

以下是我用于比较两组随机均值和标准差的示例代码。但是,我想在框图中的单个框中绘制两个组,如附图所示,其中x轴是组1,y轴是组2.我找不到任何代码执行此操作。有人可以帮帮我吗?

$(document).find('td')[0].getAttribute('context');

enter image description here

现在我想在一个方框中为exp1设置黄色和蓝色,如下所示..类似于exp2和exp3等等...所以在一个boxplot中有3个盒子。理想情况下,这应适用于任何数量的实验。

enter image description here

1 个答案:

答案 0 :(得分:3)

对于单个双面箱图,我们可以使用'Orientation'属性,并将2个箱图叠加在另一个上面:

x = [1 2 3 4 5 6 7 1 2 3 4 5 6 7];
group = [1,1,1,1,1,1,1,2,2,2,2,2,2,2];
% we need the precntiles of the groups so the boxes will overlap.
% on each boxplot we set the width to the other boxplot hight:
p1 = prctile(x(group==1),[25 75]);
p2 = prctile(x(group==2),[25 75]);
ax = axes;
% first group is vertical:
boxplot(x(group==2),'Positions',mean(x(group==1)),...
    'Orientation','vertical','Widths',p1(2)-p1(1),'Colors','r');
lims1 = axis;
hold on
% secound group is horizontal:
boxplot(x(group==1),'Positions',mean(x(group==2)),...
    'Orientation','horizontal','Widths',p2(2)-p2(1),'Colors','k');
% the values of the axis are no longer relevant, since they have two
% different meanings, depend on the group. So we hide them.
ax.XAxis.Visible = 'off';
ax.YAxis.Visible = 'off';
hold off
lims2 = axis;
% because each axis represent to different things, we make sure we see
% everything:
axis([max(lims1(1),lims2(1)),...
    min(lims1(2),lims2(2)),...
    min(lims1(3),lims2(3)),...
    max(lims1(4),lims2(4))])

two-sided box-plots

要创建多个双面框图,您需要为每个实验使用轴:

x = rand(10,6); 
nsp = floor(size(x,2)/2); % the number of subplots
meanx = mean(x);
% we need the precntiles of the groups so the boxes will overlap.
% on each boxplot we set the width to the other boxplot hight:
width = range(prctile(x,[25; 75]));
main_ax = axes; % create a tmporary axes
% we get the measurements of the ploting area:
pos = main_ax.Position;
% and divide it to our data:
axwidth = pos(3)/nsp; % the width of each group
% the bottom left corner of each group:
corner = linspace(pos(1),pos(3)+pos(1),nsp+1);
clf % clear the area!
% now we plot each pair of boxplot on a different subplot:
for k = 1:2:size(x,2)
    ax = axes('Position',[corner((k+1)/2) pos(2) axwidth pos(4)]);
    hold on
    % first group is vertical:
    boxplot(x(:,k),'Positions',meanx(k+1),...
        'Orientation','vertical','Widths',width(k+1),'Colors','r');
    % secound group is horizontal:
    boxplot(x(:,k+1),'Positions',meanx(k),...
        'Orientation','horizontal','Widths',width(k),'Colors','k');
    % the values of the y-axis are no longer relevant, since they have two
    % different meanings, depend on the group. So we hide them.
    ax.YAxis.Visible = 'off';
    % we use the x-axis to label the pairs of boxplots:
    ax.XAxis.TickLabels = ['Exp ' num2str((k+1)/2)];
    % because each axis represent to different things, we make sure we see
    % everything:
    minx = min(min(x(:,k:k+1)))*0.1;
    maxx = max(max(x(:,k:k+1)))*1.1;
    axis ([minx maxx minx maxx])
    hold off
    box off
    % set the locations to the exact same place:
    bx = findobj(ax,'tag','Box'); % get the boxes
    posXdif = bx(2).XData(1)-bx(1).XData(1); % get the horizontal difference
    posYdif = bx(2).YData(1)-bx(1).YData(1); % get the vertical difference
    bx2Xdata = get(ax.Children(2).Children,{'XData'}); % get all X-data of box 2
    bx2Ydata = get(ax.Children(2).Children,{'YData'}); % get all Y-data of box 2
    % substruct horizontal difference X-data:
    set(ax.Children(2).Children,{'XData'},... 
        cellfun(@(x) x-posXdif,bx2Xdata,'UniformOutput',false))
    % substruct vertical difference Y-data:
    set(ax.Children(2).Children,{'YData'},...
        cellfun(@(y) y-posYdif,bx2Ydata,'UniformOutput',false))
end

multiple two-sided box-plots