乐趣区

关于程序员:Matlab几种分组箱线图画法

参考并致谢
https://zhuanlan.zhihu.com/p/…
https://zhuanlan.zhihu.com/p/…

用 boxplot 或者 boxchart 来绘图。
(1)boxplot 比拟直观,是数据按列分排好后,定义各个分组的指标地位,色彩等,间接就能够绘制进去。
(2)boxchart 把矩阵拉成列向量,依据分成几组 (factor) 以及每组有几种成分 (能够用色彩) 来绘制。

疑难:
boxchart 绘制的话怎么获取每个分组中各子箱线图的横坐标??暂未解决

  1. boxplot 通过边框分组
% 须要分组的数据,size 11*4
group1 = [2.5971    3.3004    2.5300    1.4816;...
    4.5358    4.3818    2.3258    1.6239; ...
    3.9728    3.9066    2.5668    2.3065; ...
    4.8788    3.7533    2.3690    1.6233; ...
    4.0810    4.0487    2.3443    1.4953; ...
    4.3254    3.1829    3.5859    2.6255; ...
    3.2180    3.9221    2.9497    1.9923; ...
    4.6776    3.8937    3.2284    2.2298; ...
    3.3915    3.8000    3.7869    1.9339; ...
    4.2484    4.1819    1.8148    1.8452; ...
    4.8277    4.1940    2.9338    1.7708]
group2 = [4.5730    4.3172    3.1523    1.6662; ...
    5.7332    4.9923    3.2012    2.1913; ...
    4.5736    4.8696    3.3527    3.0092; ...
    5.5416    4.6020    2.7714    2.0871; ...
    5.3273    4.0853    3.2455    2.2208; ...
    5.2967    5.4538    4.0582    3.1677; ...
    4.0403    4.4890    3.4762    2.7582; ...
    3.6837    5.6476    4.2450    2.8042; ...
    5.0343    5.1616    5.1146    2.1429; ...
    5.2017    4.6968    2.6056    2.2122; ...
    5.9474    5.7000    3.9155    2.2271]
% 边框色彩
color1 = [46,114,188]/255;
color2 = [206,85,255]/255;
pos1 = 0.8:3:9.8;
pos2 = 1.4:3:10.4;
%box_1 = boxplot(group1,'positions',pos1,'Colors',color1,'Widths',0.2,'Notch','on','Symbol','o','OutlierSize',5)
box_1 = boxplot(group1,'positions',pos1,'Colors',color1,'Widths',0.4,'Symbol','o','OutlierSize',5)
set(box_1,'LineWidth',1.5);
hold on;
box_2 = boxplot(group2,'positions',pos2,'Colors',color2,'Widths',0.4,'Symbol','o','OutlierSize',5)
set(box_2,'LineWidth',1.5);
%box_2 = boxplot(group2,'positions',pos2,'Colors',color2,'Widths',0.2,'Notch','on','Symbol','o','OutlierSize',5)
set(gca,'XTick', (pos1+pos2)/2, 'XTickLabel', ["Group1", "Group2","Group3","Group4"],'Xlim',[0 12],'Ylim',[0 7]);
plot(pos1, mean(group1), '-*','Color',color1)
hold on;
plot(pos2, mean(group2), '-*','Color',color2)
hold off
leg = findobj(gca,'Tag', 'Box')
% m = []
% n = []
% findobj 先索引到的是最右侧的色彩分组,也就是说色彩是反过来的,findobj 返回的 box 的程序是从最右侧到最左侧,不分明能够取出一个 box 通过看 XData 和 YData 坐标来晓得
for i = 1:length(leg)
%     m = [m, get(leg(i), 'XData')]
%     n = [n, get(leg(i), 'YData')]
end
% m1 = reshape(m, [], length(leg))
% m2 = m1'
% n1 = reshape(n, [], length(leg))
% n2 = n1'% plot(m2(1,:),n2(1,:),'-o')
% patch(m2(1,:),n2(1,:),'r')
l = legend([leg(5),leg(1)], ["A_ratio","B_ratio"])
set(l,'Interpreter','none') % 避免下划线_被误解析,或者可用 strrep
ylabel('Ratio')
set(gca,'XGrid','off','YGrid','on', 'LineWidth', 2, 'Fontsize', 11)
% savefig(gcf,'boxplot_ratio.fig');
% print(gcf, '-dpdf', 'boxplot_ratio.pdf') 

失去分组箱线图

  1. boxplot 通过填充色彩分组
% 须要分组的数据,size 11*4
group1 = [2.5971    3.3004    2.5300    1.4816;...
    4.5358    4.3818    2.3258    1.6239; ...
    3.9728    3.9066    2.5668    2.3065; ...
    4.8788    3.7533    2.3690    1.6233; ...
    4.0810    4.0487    2.3443    1.4953; ...
    4.3254    3.1829    3.5859    2.6255; ...
    3.2180    3.9221    2.9497    1.9923; ...
    4.6776    3.8937    3.2284    2.2298; ...
    3.3915    3.8000    3.7869    1.9339; ...
    4.2484    4.1819    1.8148    1.8452; ...
    4.8277    4.1940    2.9338    1.7708]
group2 = [4.5730    4.3172    3.1523    1.6662; ...
    5.7332    4.9923    3.2012    2.1913; ...
    4.5736    4.8696    3.3527    3.0092; ...
    5.5416    4.6020    2.7714    2.0871; ...
    5.3273    4.0853    3.2455    2.2208; ...
    5.2967    5.4538    4.0582    3.1677; ...
    4.0403    4.4890    3.4762    2.7582; ...
    3.6837    5.6476    4.2450    2.8042; ...
    5.0343    5.1616    5.1146    2.1429; ...
    5.2017    4.6968    2.6056    2.2122; ...
    5.9474    5.7000    3.9155    2.2271]
% 边框色彩,都一样,用彩色
edgecolor1 = [0,0,0];
edgecolor2 = [0,0,0];
% 箱线图框内填充色彩
filledcolor1 = [46,114,188]/255;
filledcolor2 = [206,85,255]/255; 
% 留神这里和办法 1 的色彩填充程序是反过来,先 filledcolor2 再 filledcolor1, 因为前面代码 findobj 先索引到的是最右侧的色彩分组
filledcolor = [repmat(filledcolor2, size(group1,2), 1); repmat(filledcolor1, size(group2,2), 1)]
pos1 = 0.8:3:9.8;
pos2 = 1.4:3:10.4;
box_1 = boxplot(group1,'positions',pos1,'Colors',edgecolor1,'Widths',0.4,'Symbol','o','OutlierSize',5)
set(box_1,'LineWidth',1.5);
hold on;
box_2 = boxplot(group2,'positions',pos2,'Colors',edgecolor2,'Widths',0.4,'Symbol','o','OutlierSize',5)
set(box_2,'LineWidth',1.5);
set(gca,'XTick', (pos1+pos2)/2, 'XTickLabel', ["Group1", "Group2","Group3","Group4"],'Xlim',[0 12],'Ylim',[0 7]);
plot(pos1, mean(group1), '-*', 'Color', filledcolor1)
plot(pos2, mean(group2), '-*','Color',filledcolor2)
hold off
% 这里 findobj 返回的 box 的程序是从最右侧到最左侧,不分明能够取出一个 box 通过看 XData 和 YData 坐标来晓得
boxobj = findobj(gca, 'Tag', 'Box')
% m = []
% n = []
for i = 1:length(boxobj)
    patch(get(boxobj(i), 'XData'), get(boxobj(i), 'YData'), filledcolor(i,:), 'FaceAlpha', 0.5)
%     m = [m, get(boxobj(i), 'XData')]   
%     n = [n, get(boxobj(i), 'YData')]
end
% m1 = reshape(m,[],length(boxobj))
% m2 = m1'
% n1 = reshape(n,[],length(boxobj))
% n2 = n1'% plot(m2(1,:),n2(1,:),'-o')
% patch(m2(1,:),n2(1,:),'r')
% a = get(boxobj(1),'XData')
% b = get(boxobj(1),'YData')
% patch(a,b,'red')
leg = get(gca, 'Children')
l = legend([leg(1),leg(5)], ["A_ratio","B_ratio"])
set(l,'Interpreter','none') % 避免下划线_被误解析,或者可用 strrep
ylabel('Ratio')
set(gca,'XGrid','off','YGrid','on', 'LineWidth', 2, 'Fontsize', 11)
% savefig(gcf,'boxplot_ratio.fig');
% print(gcf, '-dpdf', 'boxplot_ratio.pdf')  % 保留为 pdf 文件

失去分组箱线图

  1. boxchart
% 须要分组的数据,size 11*4
group1 = [2.5971    3.3004    2.5300    1.4816;...
    4.5358    4.3818    2.3258    1.6239; ...
    3.9728    3.9066    2.5668    2.3065; ...
    4.8788    3.7533    2.3690    1.6233; ...
    4.0810    4.0487    2.3443    1.4953; ...
    4.3254    3.1829    3.5859    2.6255; ...
    3.2180    3.9221    2.9497    1.9923; ...
    4.6776    3.8937    3.2284    2.2298; ...
    3.3915    3.8000    3.7869    1.9339; ...
    4.2484    4.1819    1.8148    1.8452; ...
    4.8277    4.1940    2.9338    1.7708]
group2 = [4.5730    4.3172    3.1523    1.6662; ...
    5.7332    4.9923    3.2012    2.1913; ...
    4.5736    4.8696    3.3527    3.0092; ...
    5.5416    4.6020    2.7714    2.0871; ...
    5.3273    4.0853    3.2455    2.2208; ...
    5.2967    5.4538    4.0582    3.1677; ...
    4.0403    4.4890    3.4762    2.7582; ...
    3.6837    5.6476    4.2450    2.8042; ...
    5.0343    5.1616    5.1146    2.1429; ...
    5.2017    4.6968    2.6056    2.2122; ...
    5.9474    5.7000    3.9155    2.2271]

datatab = table();
datatab1 = table();
datatab2 = table();
% datatab.data = [group1(:,1);group2(:,1);group1(:,2);group2(:,2);group1(:,3);group2(:,3);group1(:,4);group2(:,4)];
data = zeros(size(group1,1), 2*size(group1, 2))
data(:, 1:2:end) = group1
data(:, 2:2:end) = group2
datatab.data = reshape(data,[],1)
datatab1.data1 = reshape(group1,[],1)
datatab2.data2 = reshape(group2,[],1)
factors = 4;
factor = [ones(2*size(group1, 1),1); 2*ones(2*size(group1, 1),1); 3*ones(2*size(group1, 1),1); 4*ones(2*size(group1, 1),1)]
factor1 = [ones(size(group1, 1),1); 2*ones(size(group1, 1),1); 3*ones(size(group1, 1),1); 4*ones(size(group1, 1),1)]
factor2 = [ones(size(group2, 1),1); 2*ones(size(group2, 1),1); 3*ones(size(group2, 1),1); 4*ones(size(group2, 1),1)]
groupmark1 = repmat(["A_ratio"], size(group1, 1), 1)
groupmark2 = repmat(["B_ratio"], size(group2, 1), 1)
groupmark = repmat([groupmark1; groupmark2], factors, 1)
datatab.group = groupmark
% 调整分组之间的间距,就用一个常数比方 1.5 乘以 factor
datatab.factor = 1.5*factor
datatab1.factor1 = 1.5*factor1
datatab2.factor2 = 1.5*factor2
% 接下来还想计算分组箱线图各自的均值,须要确定各均值点的横坐标
% 每个分组顺次的横坐标地位
factor_vec = 1.5*unique(factor)
% 每个分组左右两个箱线图,相当于在每个分组的核心左右平移了,这里是 0.5
factor_vec1 = factor_vec - 0.5
factor_vec2 = factor_vec + 0.5
color1 = [46, 114, 188]/255;
color2 = [206, 85, 30]/255;
color = {color1; color2};
%color = {[0.5,0.5,0.5];[0,0,0]};
axesbox = boxchart(datatab.factor,datatab.data,'GroupByColor',datatab.group)
hold on
meanRatio_1 = groupsummary(datatab1.data1, datatab1.factor1, 'mean')
x_1 = (factor_vec+factor_vec1)/2
plot(x_1, meanRatio_1, '-*', "Color",color1)
meanRatio_2 = groupsummary(datatab2.data2, datatab2.factor2, 'mean')
%plot([1.75:1.5:6.25], meanCNR_S, '-*', "Color",color2)
x_2 = (factor_vec+factor_vec2)/2
plot(x_2, meanRatio_2, '-*', "Color",color2)
hold off
set(axesbox, {'BoxFaceColor'}, color,{'MarkerColor'},color, 'LineWidth',1.5)
set(gca, 'XTick', factor_vec, 'XTickLabel', ["Group1", "Group2","Group3","Group4"])
set(gca,'XGrid','off','YGrid','on', 'LineWidth', 2, 'Fontsize', 11)
l= legend(axesbox)
% 避免下划线_被误解析,或者可用 strrep
set(l,'Interpreter','none')
ylabel('Ratio')
% savefig(gcf,'boxchart_ratio.fig');
% print(gcf, '-dpdf', 'boxchart_ratio.pdf') 

失去分组箱线图

退出移动版