0001 function sout = myboxplot (data,notched,symbol,vertical,maxwhisker)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 if nargin < 5 | isempty(maxwhisker), maxwhisker = 1.5; end
0023 if nargin < 4 | isempty(vertical), vertical = 1; end
0024 if nargin < 3 | isempty(symbol), symbol = ['+','o']; end
0025 if nargin < 2 | isempty(notched), notched = 0; end
0026
0027 if length(symbol)==1, symbol(2)=symbol(1); end
0028
0029 if notched==1, notched=0.25; end
0030 a=1-notched;
0031
0032
0033 if iscell(data),
0034 nc = length(data);
0035 else
0036
0037 nc = size(data,2);
0038 end
0039
0040
0041
0042
0043
0044
0045 s = zeros(7,nc);
0046 box = zeros(1,nc);
0047 whisker_x = ones(2,1)*[1:nc,1:nc];
0048 whisker_y = zeros(2,2*nc);
0049 outliers_x = [];
0050 outliers_y = [];
0051 outliers2_x = [];
0052 outliers2_y = [];
0053
0054 for i=1:nc
0055
0056 if iscell(data)
0057 col = data{i}(:);
0058 else
0059 col = data(:,i);
0060 end
0061
0062
0063 col(isnan(col)) = [];
0064
0065
0066 nd = length(col);
0067 box(i) = nd;
0068 if (nd > 1)
0069
0070
0071 s(1,i)=min(col);
0072 s(5,i)=max(col);
0073 s(2,i)=myprctilecol(col,25);
0074 s(3,i)=myprctilecol(col,50);
0075 s(4,i)=myprctilecol(col,75);
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 est = 1.57*(s(4,i)-s(2,i))/sqrt(nd);
0086 s(6,i) = max([s(3,i)-est, s(2,i)]);
0087 s(7,i) = min([s(3,i)+est, s(4,i)]);
0088
0089 IQR = maxwhisker*(s(4,i)-s(2,i));
0090 whisker_y(:,i) = [min(col(col >= s(2,i)-IQR)); s(2,i)];
0091 whisker_y(:,nc+i) = [max(col(col <= s(4,i)+IQR)); s(4,i)];
0092
0093 outliers = col((col < s(2,i)-IQR & col >= s(2,i)-2*IQR) | (col > s(4,i)+IQR & col <= s(4,i)+2*IQR));
0094 outliers2 = col(col < s(2,i)-2*IQR | col > s(4,i)+2*IQR);
0095 outliers_x = [outliers_x; i*ones(size(outliers))];
0096 outliers_y = [outliers_y; outliers];
0097 outliers2_x = [outliers2_x; i*ones(size(outliers2))];
0098 outliers2_y = [outliers2_y; outliers2];
0099 elseif (nd == 1)
0100
0101 s(:,i) = col;
0102
0103 outliers_x = [outliers_x; i];
0104 outliers_y = [outliers_y; col];
0105 else
0106
0107 s(:,i) = NaN;
0108 end
0109 end
0110
0111
0112
0113 chop = find(box <= 1);
0114
0115
0116
0117 box = box*0.23/max(box);
0118 quartile_x = ones(11,1)*[1:nc] + [-a;-1;-1;1;1;a;1;1;-1;-1;-a]*box;
0119 quartile_y = s([3,7,4,4,7,3,6,2,2,6,3],:);
0120
0121
0122 median_x = ones(2,1)*[1:nc] + [-a;+a]*box;
0123
0124 median_y = s([3,3],:);
0125
0126
0127 quartile_x(:,chop) = [];
0128 quartile_y(:,chop) = [];
0129 whisker_x(:,[chop,chop+nc]) = [];
0130 whisker_y(:,[chop,chop+nc]) = [];
0131 median_x(:,chop) = [];
0132 median_y(:,chop) = [];
0133
0134
0135 cap_x = whisker_x;
0136 cap_x(1,:) =cap_x(1,:)- 0.05;
0137 cap_x(2,:) =cap_x(2,:)+ 0.05;
0138 cap_y = whisker_y([1,1],:);
0139
0140
0141
0142
0143
0144
0145
0146
0147 mm=min(min(data));
0148 MM=max(max(data));
0149
0150 if vertical
0151 plot (quartile_x, quartile_y, 'b', ...
0152 whisker_x, whisker_y, 'b--', ...
0153 cap_x, cap_y, 'k', ...
0154 median_x, median_y, 'r', ...
0155 outliers_x, outliers_y, [symbol(1),'r'], ...
0156 outliers2_x, outliers2_y, [symbol(2),'r']);
0157 set(gca,'XTick',1:nc);
0158 set(gca, 'XLim', [0.5, nc+0.5]);
0159 set(gca, 'YLim', [mm-(MM-mm)*0.05-eps, MM+(MM-mm)*0.05+eps]);
0160
0161 else
0162
0163
0164
0165
0166
0167
0168 end
0169
0170 if nargout,
0171 sout=s;
0172 end
0173