Matlab IoSR Statistics Boxplot - 胡须显示分位数错误?
Matlab IoSR Statistics Boxplot - whisker showing quantiles wrong?
我在 Matlab 中有一些数据,我想使用箱线图绘制。由于标准箱线图的可定制性不够,我决定使用 IoSR Statistics Toolbox 中的箱线图功能。我希望箱线图具有显示 0.025 和 0.975 分位数的须线,而箱体本身显示四分位数间距和中位数(无论如何这是默认设置)。一个典型的数据集例如
p = [60.1 93 135.2 69 107.1 98.4 118.9 83.9 67 74.5 102.5 120.8 103.7 114.3 102.4 139.9 110.4 119.3 105.1 79.8 222.7 185.3 76.4 100.2 61.2 131.6 87.2 96 113.3 52.9 78.5 163.3 65.4 64.4];
我用标准的 Matlab 方法计算了 0.025 和 0.975 分位数 prctile()
以及箱线图方法应该使用的工具箱 quantile()
的分位数函数并得到完全相同的结果结果:
prctile(p,2.5,2) -> ans = 55.4200
prctile(p,97.5,2) -> ans = 209.6100
iosr.statistics.quantile(p,0.025,2,'R-5') -> ans = 55.4200
iosr.statistics.quantile(p,0.975,2,'R-5') -> ans = 209.6100
但是,当我使用下面的代码创建箱线图时,我得到的胡须不知何故太短了。上须线结束于 185.3,而不是 209.61,下须线延伸至 60.1,而不是 55.42。胡须现在正好在数据集的第二大/最小值处结束,而手动计算的分位数似乎利用某种插值方案来获得它们的值。
我在这里弄错了什么?如何让箱线图显示与手动计算相同的分位数?
iosr.statistics.boxPlot(["data"],p'...
,'limit',[2.5, 97.5],'boxColor',[0.5 0.5 0.5],'lineColor','k'...
,'medianColor',[0.2 0.2 0.2],'method','R-5','showOutliers',false...
,'xspacing','equal')
确实 prctile
函数 uses interpolation 计算了精确的百分位数值。
同时,根据 IoSR 箱线图函数的 source code:
the whiskers extend to the most extreme data that are not considered outliers
所以选项 'limit'
不是设置胡须直接结束的位置,而是设置标记异常值的位置。
我去了 confirmed it with your example data. 这里红线是你想要的分位数,蓝点是你的数据。我已经标记了最远的数据点,果然,那是你的胡须结束的地方。
至于如何让它显示所需的百分位标记,我不确定,因为我没有工具箱,但我建议您查看他们添加百分位的选项;查看帮助或文档? (不确定文档在哪里) 可能相关的选项包括:
% addPrctiles - Show additional percentiles using markers and
% labels. The property should be a vector of
% percentiles; each percentile will be plotted
% for each box. The property is empty by
% default.
...
% addPrctilesLabels - Specify labels for the additional
% percentiles. The property should be a cell
% array of strings. By defualt no label
% is shown.
% addPrctilesMarkers - Specify markers for the additional
% percentiles. The property should be a cell
% array of strings indicating the shape of each
% percentile; the markers will be repeated for
% each box. The default is '*'.
或者,您可以使用对象句柄直接操作胡须:
% handles - Structure containing handles to the various
% objects that constitute the plot. The
% fields/handles are:
% 'axes' : the parent axes of
% the box plot
% 'fig' : the parent figure of
% the box plot
% 'addPrctiles' : chart line objects
% for each additional
% percentile marker
% 'addPrctilesTxt' : text objects for each
% additional percentile
% marker
...
% 'upperWhiskers' : line objects for each
% upper whisker line
% 'lowerWhiskers' : line objects for each
% lower whisker line
% 'upperWhiskerTips': line objects for each
% upper whisker tip
% 'lowerWhiskerTips': line objects for each
可能使用这样的语法:
h = iosr.statistics.boxPlot(["data"],p',...)
h.upperWhiskers = % XY coordinates for desired line
h.lowerWhiskers = % XY coordinates for desired line
我在 Matlab 中有一些数据,我想使用箱线图绘制。由于标准箱线图的可定制性不够,我决定使用 IoSR Statistics Toolbox 中的箱线图功能。我希望箱线图具有显示 0.025 和 0.975 分位数的须线,而箱体本身显示四分位数间距和中位数(无论如何这是默认设置)。一个典型的数据集例如
p = [60.1 93 135.2 69 107.1 98.4 118.9 83.9 67 74.5 102.5 120.8 103.7 114.3 102.4 139.9 110.4 119.3 105.1 79.8 222.7 185.3 76.4 100.2 61.2 131.6 87.2 96 113.3 52.9 78.5 163.3 65.4 64.4];
我用标准的 Matlab 方法计算了 0.025 和 0.975 分位数 prctile()
以及箱线图方法应该使用的工具箱 quantile()
的分位数函数并得到完全相同的结果结果:
prctile(p,2.5,2) -> ans = 55.4200
prctile(p,97.5,2) -> ans = 209.6100
iosr.statistics.quantile(p,0.025,2,'R-5') -> ans = 55.4200
iosr.statistics.quantile(p,0.975,2,'R-5') -> ans = 209.6100
但是,当我使用下面的代码创建箱线图时,我得到的胡须不知何故太短了。上须线结束于 185.3,而不是 209.61,下须线延伸至 60.1,而不是 55.42。胡须现在正好在数据集的第二大/最小值处结束,而手动计算的分位数似乎利用某种插值方案来获得它们的值。
我在这里弄错了什么?如何让箱线图显示与手动计算相同的分位数?
iosr.statistics.boxPlot(["data"],p'...
,'limit',[2.5, 97.5],'boxColor',[0.5 0.5 0.5],'lineColor','k'...
,'medianColor',[0.2 0.2 0.2],'method','R-5','showOutliers',false...
,'xspacing','equal')
确实 prctile
函数 uses interpolation 计算了精确的百分位数值。
同时,根据 IoSR 箱线图函数的 source code:
the whiskers extend to the most extreme data that are not considered outliers
所以选项 'limit'
不是设置胡须直接结束的位置,而是设置标记异常值的位置。
我去了 confirmed it with your example data. 这里红线是你想要的分位数,蓝点是你的数据。我已经标记了最远的数据点,果然,那是你的胡须结束的地方。
至于如何让它显示所需的百分位标记,我不确定,因为我没有工具箱,但我建议您查看他们添加百分位的选项;查看帮助或文档? (不确定文档在哪里) 可能相关的选项包括:
% addPrctiles - Show additional percentiles using markers and
% labels. The property should be a vector of
% percentiles; each percentile will be plotted
% for each box. The property is empty by
% default.
...
% addPrctilesLabels - Specify labels for the additional
% percentiles. The property should be a cell
% array of strings. By defualt no label
% is shown.
% addPrctilesMarkers - Specify markers for the additional
% percentiles. The property should be a cell
% array of strings indicating the shape of each
% percentile; the markers will be repeated for
% each box. The default is '*'.
或者,您可以使用对象句柄直接操作胡须:
% handles - Structure containing handles to the various
% objects that constitute the plot. The
% fields/handles are:
% 'axes' : the parent axes of
% the box plot
% 'fig' : the parent figure of
% the box plot
% 'addPrctiles' : chart line objects
% for each additional
% percentile marker
% 'addPrctilesTxt' : text objects for each
% additional percentile
% marker
...
% 'upperWhiskers' : line objects for each
% upper whisker line
% 'lowerWhiskers' : line objects for each
% lower whisker line
% 'upperWhiskerTips': line objects for each
% upper whisker tip
% 'lowerWhiskerTips': line objects for each
可能使用这样的语法:
h = iosr.statistics.boxPlot(["data"],p',...)
h.upperWhiskers = % XY coordinates for desired line
h.lowerWhiskers = % XY coordinates for desired line