MATLAB绘图笔记——画箱形图

简介

箱形图,又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。箱形图于1977年由美国著名统计学家约翰·图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、上下四分位数及异常值。

Matlab boxplot命令

boxplot(X):产生矩阵X的每一列的盒图和“须”图,“须”是从盒的尾部延伸出来,并表示盒外数据长度的线,如果“须”的外面没有数据,则在“须”的底部有一个点。
boxplot(X,notch):当notch=1时,产生一凹盒图,notch=0时产生一矩箱图。 默认为0.
boxplot(X,notch,‘sym’):sym表示图形符号,默认值为“+”。
boxplot(X,notch,‘sym’,vert) %当vert=0时,生成水平盒图,vert=1时,生成竖直盒图(默认值vert=1)。
boxplot(X,notch,‘sym’,vert,whis) %whis定义“须”图的长度,默认值为1.5,若whis=0则boxplot函数通过绘制sym符号图来显示盒外的所有数据值

相同大小(行数相同)数据绘图

clc
clear all
close all

rng default  % For reproducibility
x = randn(100,25);
figure

subplot(2,1,1)
boxplot(x)

subplot(2,1,2)
boxplot(x,'PlotStyle','compact')

不同大小(行数不同)数据绘图

命令:boxplot(x,g)
其中,x为n*1的数据,g为数据的分组(或标签)。

clc
clear all
close all

x = rand(50,1);
y = rand(30,1);
z = rand(55,1);
% group = [repmat(1, size(x,1), 1); repmat(2, size(y,1), 1); repmat(3, size(z,1), 1)];
group = [repmat('x', size(x,1), 1); repmat('y', size(y,1), 1); repmat('z', size(z,1), 1)];
boxplot([x;y;z], group);

提取boxplot绘图中的中值、最大、最小值、异常值等

boxplot返回不同图形对象的句柄数组。
默认参数,输出是7 x M个句柄数组,其中M是boxplot组的数量(即箱型图的数量),每个都有以下7个句柄,分别如下:
1.Upper Whisker
2.lower Whisker
3.Upper Adjacent value
4.Lower Adjacent value
5.Box
6.Median
7.Outliers

在不同的参数下,boxplot可能会返回不同数量的句柄,因此最好通过标记找到所需的内容。
要提取数据,您必须访问特定对象的Data属性(如果此属性存在)。

例子:

clc
clear all
close all

x1 = [10 12 9 8 12 11 15 12 34 12 9];
x2 = [13 14 6 9 18 16 47 18 54 13 6];

figure
boxplot([x1' x2'])

第一组数据中异常值 34,第二组数据异常值为47 和 54。现在我们提取这几个异常数据。

h = findobj(gcf,'tag','Outliers');
xdata = get(h,'XData')
ydata = get(h,'YData')

即可得到异常值在窗口中的x轴值和y轴值。
也可以使用下面的代码获得这些数据,推荐使用这种方法获得!

outlier = get(h(7),'YData');
media = get(h(6),'YData');
minv = get(h(4),'YData');
maxv = get(h(3),'YData');

指定x轴位置绘制box

X = [1.2 1.8 3.2 3.8 5.2 5.8];
Y = rand(100, 6);
boxplot(Y, 'positions', X, 'labels', X)

不同数据大小指定x轴位置绘图

clc
clear all
close all

x0 = [9 10 12 9 8 12 11 16 12 10];
x1 = [1 10 12 9 8 12 11 15 12 34 12 7];
x2 = [8 13 14 6 9 18 16 47 18 54 13 6 8];
x = [x0';x1';x2'];
g = [repmat(1,length(x0),1);repmat(2,length(x1),1);repmat(3,length(x2),1)];
pos = [1.5 2 5];
boxplot(x,g,'positions', pos, 'labels', pos)

异常值判别方法

判断异常值,需要明白几个概念,什么是异常值?什么是分位数?

异常值:是位于数据系列中的极端值,该异常值非常小或非常大,因此可能影响数据系列的整体。异常值通常被视为极值,由于其极高或极低的值而可能影响整体,因此应从数据中丢弃。

异常值也可以表示为位于分布的整体之外的值,因此可以影响整个数据系列。异常值通常被认为是由于存在可能低估或高估研究的极值而导致测量误差的原因,因为它与来自群体的随机样本中的其他值具有异常距离。

根据所有统计学家遵循的基本标准,对异常值的通用定义是落在第三个四分位数之上或低于第一个四分位数的四分位数距的1.5倍以上。

四分位数:分位数是将总体的全部数据按大小顺序排列后,处于各等分位置的变量值。如果将全部数据分成相等的两部分,它就是中位数;如果分成四等分,就是四分位数。四分位数有三个,第一个四分位数就是通常所说的四分位数,称为下四分位数,第二个四分位数就是中位数,第三个四分位数称为上四分位数,分别用Q1、Q2、Q3表示。

第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
第三四分位数与第一四分位数的差距又称四分位距(InterQuartile Range,IQR)。

确定异常值

n n n是数据集中的数据值的数量。中位数(Q2)是数据集的中间值。
M e d i a n ( Q 2 ) = 1 / 2 ( n + 1 ) t h   t e r m Median(Q_2)=1/2(n+1)_{th}\ term Median(Q2)=1/2(n+1)th term
下四分位数(Q1)是数据集下半部分的中位数
L o w e r   Q u a r t i t l e ( Q 1 ) = 1 / 4 ( n + 1 ) t h   t e r m Lower\ Quartitle(Q_1)=1/4(n+1)_{th}\ term Lower Quartitle(Q1)=1/4(n+1)th term
上四分位数(Q3)是数据集上半部分的中位数
U p p e r   Q u a r t i t l e ( Q 3 ) = 1 / 4 ( n + 1 ) t h   t e r m Upper\ Quartitle(Q_3)=1/4(n+1)_{th}\ term Upper Quartitle(Q3)=1/4(n+1)th term

四分位数距(IQR)是中间50%数据值的差。
四分位数间距(IQR)=上四分位数(Q3) - 下四分位数(Q1)
I Q R = Q 3 − Q 1 IQR=Q_3-Q_1 IQR=Q3Q1
判别条件
L o w e r   L i m i t = Q 1 − 1.5 I Q R Lower\ Limit=Q_1-1.5IQR Lower Limit=Q11.5IQR

U p p e r   L i m i t = Q 3 + 1.5 I Q R Upper\ Limit=Q_3+1.5IQR Upper Limit=Q3+1.5IQR

因此,任何超过上限或小于下限的值都将是异常值。 只有位于下限和上限内的数据在统计上被认为是正常的,因此可用于进一步观察或研究。

例子

设数据范围为199,201,236,269,271,278,283,291,301,303和341
因此n = 11
M e d i a n ( Q 2 ) = 1 / 2 ( 11 + 1 ) t h   t e r m = 6 t h   T e r m Median(Q_2)=1/2(11+1)th\ term=6th\ Term Median(Q2)=1/2(11+1)th term=6th Term

Q 2 = 278 Q_2=278 Q2=278
L o w e r   Q u a r t i t l e ( Q 1 ) = 1 / 4 ( 11 + 1 ) t h   t e r m = 3 r d   T e r m Lower\ Quartitle(Q_1)=1/4(11+1)th\ term=3rd\ Term Lower Quartitle(Q1)=1/4(11+1)th term=3rd Term

Q 1 = 236 Q_1=236 Q1=236
U p p e r   Q u a r t i t l e ( Q 3 ) = 3 / 4 ( 11 + 1 ) t h   t e r m = 9 r d   T e r m Upper\ Quartitle(Q_3)=3/4(11+1)th\ term=9rd\ Term Upper Quartitle(Q3)=3/4(11+1)th term=9rd Term

Q 3 = 301 Q_3=301 Q3=301
I n t e r Q u a r t i l e R a n g e ( I Q R ) = Q 3 − Q 1 = 301 − 278 = 23 Inter Quartile Range(IQR)=Q_3-Q_1=301-278=23 InterQuartileRange(IQR)=Q3Q1=301278=23

I Q R = 23 IQR=23 IQR=23
L o w e r   L i m i t = Q 1 − 1.5 I Q R = 236 − 1.5 ( 23 ) Lower\ Limit=Q_1-1.5IQR=236-1.5(23) Lower Limit=Q11.5IQR=2361.5(23)

L o w e r   L i m i t = 201.5 Lower\ Limit=201.5 Lower Limit=201.5

U p p e r   L i m i t = Q 3 + 1.5 I Q R = 301 + 1.5 ( 23 ) Upper\ Limit=Q_3+1.5IQR=301+1.5(23) Upper Limit=Q3+1.5IQR=301+1.5(23)

U p p e r   L i m i t = 335.5 Upper\ Limit=335.5 Upper Limit=335.5

因此很明显,任何高于333.5或低于201.5的范围都是异常值。 因此,在数据系列199,201,236,269,271,278,283,291,301,303,341中,异常值分别为199,201和341.这三个值位于任何一个极值上都可以认为是异常的,应该从整个系列中丢弃。 任何对这个系列的分析都不受这些极端值的影响。 因此,丢弃异常值后应考虑进一步观察或研究的数据系列如下。

236,269,271,278,283,291,301,303

获取统计信息的两种方法

下面两个函数实现的功能一样,都是从一组数据中获取最小最大中值均值标准差和异常值。函数1从boxplot出发,获取图形中这些统计数据,函数2直接进行计算根据定义判断异常值,求剩余数据的统计信息。函数1和函数2功能一样,效率不同,函数1效率极低。
函数1:

% 1.Upper Whisker
% 2.lower Whisker
% 3.Upper Adjacent value
% 4.Lower Adjacent value
% 5.Box
% 6.Median
% 7.Outliers

% X_n*1
% x0 = [9 10 12 9 8 12 11 16 12 10 12 9 7];
% x1 = [1 10 12 9 8 12 11 15 12 34 12 9 7];
% x2 = [8 13 14 6 9 18 16 47 18 54 13 6 8];
% [minv,maxv,media, meanv, outlier] = boxvalue(x0')

function [minv, maxv, medi, meanv, stdv, outlier] = boxvalue(x)
meanv  = [];
stdv = [];
if isempty(x)
    minv = nan;
    maxv = nan;
    medi = nan;
    meanv = nan;
    stdv = nan;
    outlier = nan;
return;    
end

figure(11)

h = boxplot(x);
medi = get(h(6),'YData'); medi = medi(1);
minv = get(h(4),'YData'); minv = minv(1);
maxv = get(h(3),'YData'); maxv = maxv(1);
outlier = get(h(7),'YData');

%无异常值情况
if length(outlier)==1 & isnan(outlier)
    meanv = mean(x);
    stdv = std(x);
    close 11
    return;
end

%有异常值情况
ids = [];
outlier = unique(outlier);
for i=1:length(outlier)
    ids = [ids find(x==outlier(i))'];    
end
ids = sort(ids,'descend');
for i=1:length(ids)
    x(ids(i)) = [];
end
stdv = std(x);
meanv = mean(x);
close 11
end


函数2:

function [minv, maxv, medi, meanv, stdv, outlier] = statistic(x)
minv = nan;
maxv = nan;
medi = nan;
meanv = nan;
stdv = nan;
outlier = nan;
if isempty(x)
    return;    
end

Q = quantile(x,[0.25 0.75]);
Q1 = Q(1);
Q3 = Q(2);
IQR = Q3-Q1;

low_limit = Q1-1.5*IQR;
upp_limit = Q3+1.5*IQR;
low_ids = x<=low_limit;
upp_ids = x>=upp_limit;

ids = ~low_ids & ~upp_ids;
if sum(ids)==0
    return;
end
val = x(ids);

minv = min(val);
maxv = max(val);
medi = median(val);
stdv = std(val);
meanv = mean(val);
outlier = x(low_ids | upp_ids);
end

https://www.whatissixsigma.net/box-plot-diagram-to-identify-outliers/
https://socratic.org/questions/how-do-you-calculate-outliers-when-drawing-box-plots

参考
https://ww2.mathworks.cn/help/stats/boxplot.html
https://www.jianshu.com/p/bf3d1a74b45d
https://stackoverflow.com/questions/9728970/matlab-extract-values-from-boxplot

  • 89
    点赞
  • 507
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要使用Python箱形图,可以使用matplotlib库中的boxplot函数来实现。下面是一个示例代码来展示如何使用Python箱形图: ``` import numpy as np import matplotlib.pyplot as plt # 创建数据 data = np.random.normal((3, 5, 4), (1.25, 1.00, 1.25), (100, 3)) # 设置图形大小和字体样式 plt.figure(figsize=(10, 8)) plt.rcParams['font.family'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False # 绘制箱形图 plt.subplot(121) plt.title('标准情况下') view = plt.boxplot(data) plt.subplot(122) plt.title('添加widths') view = plt.boxplot(data, widths=[2, 0.5, 0.7]) plt.show() ``` 上述代码中,首先导入numpy和matplotlib.pyplot库。然后,使用numpy生成随机数据作为箱形图数据。接下来,可以设置图形的大小和字体样式。然后,在subplot中绘制两个子图,分别展示了标准情况下和添加widths参数的箱形图。最后,使用plt.show()函数显示绘制的图形。 通过调整参数,可以实现不同的效果。比如,可以使用vert参数(默认为True)来控制箱形图是竖直还是水平显示,可以使用whis参数来控制箱形图的须的长度等等。下面是一个示例代码来展示如何使用这些参数: ``` import numpy as np import matplotlib.pyplot as plt # 创建数据 data = np.random.normal((3, 5, 4), (1.25, 1.00, 1.25), (100, 3)) # 设置图形大小和字体样式 plt.figure(figsize=(10, 8)) plt.rcParams['font.family'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False # 绘制箱形图 plt.subplot(121) plt.title('vert=True') view = plt.boxplot(data, vert=True) plt.subplot(122) plt.title('vert=False') view = plt.boxplot(data, vert=False) plt.show() ``` 上面的代码中,在绘制箱形图时,添加了vert参数来控制箱形图的显示方向。当vert为True时,表示箱形图竖直显示;当vert为False时,表示箱形图水平显示。 除了vert参数之外,还可以通过设置whis参数来控制箱形图的须的长度。下面是一个示例代码来展示如何使用whis参数: ``` import numpy as np import matplotlib.pyplot as plt # 创建数据 data = np.random.normal((3, 5, 4), (1.25, 1.00, 1.25), (100, 3)) # 设置图形大小和字体样式 plt.figure(figsize=(10, 8)) plt.rcParams['font.family'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False # 绘制箱形图 plt.subplot(121) plt.title('标准情况下') view = plt.boxplot(data) plt.subplot(122) plt.title('添加whis') view = plt.boxplot(data, whis=1) plt.show() ``` 上面的代码中,使用whis参数来设置箱形图须的长度。默认情况下,whis为1.5,即须的长度为1.5倍的四分位距。通过改变whis的值,可以调整箱形图须的长度。 这些是使用Python绘制箱形图的一些基本方法和参数。可以根据具体需求进行调整和定制,以满足自己的绘图需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python 绘制箱型图](https://blog.csdn.net/KIKI_ZSH/article/details/123419113)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值