用python绘制箱线图,python箱线图怎么看
概念
箱线图按四分位数显示数据的分布。比如数据的中心位置,数据之间的分散程度,是否有异常值等。
把数据从小到大排列,平均分成四份。第一、第二和第三分位数(Q1、Q2和Q3)分别占数据的25%、50%和75%。
四分位数间距(IQR))=)=上四分位数)-下四分位数
盒图分为两部分,即盒和须。Box用于表示从第一个分位数到第三个分位数的数据,whisker用于表示数据的范围。
箱线图从上到下的水平线分别表示:数据上限(通常为Q3 1.5IQR)、第三分位数(Q3)、第二分位数(中位数)、第一分位数(Q1)和数据下限(通常为Q1-1.5IQR)。有时候会有一些点,在数据的上下限之外,表示异常值。
(注意:如果数据的上下限非常大,whisker会显示数据的最大值和最小值。)
情况
1.利用熊猫自身的功能。
在pandas中使用dataframe数据结构来存储要显示的数据。如果要显示的数据列表中的数据长度不一致,可以先使用Series函数将其转换为系列数据,然后将其存储在dataframe中。如果对应索引的值不存在,则为NaN。
下面我们随机生成4组数据,看看它们的箱线图。
[代码]
将numpy作为np导入
进口熊猫作为pd
从matplotlib导入pyplot作为plt
DEF _ GENERATOR (mean,dis,number): #封装这个函数以后生成数据。
返回np.random.normal (mean,dis * dis,number) #正态分布,输入参数为均值、标准差和生成量。
#我们为实验生成了四组数据,数据量分别为70-100。
y1=list_generator(0.8531,0.0956,70)
y2=list_generator(0.8631,0.0656,80)
y3=列表生成器(0.8731,0.1056,90)
y4=列表生成器(0.8831,0.0756,100)
#如果数据大小不同,请记住需要以下语句将数组更改为序列
y1=pd。Series(np.array(y1))
y2=pd。系列(np.array(y2))
y3=pd。系列(np.array(y3))
y4=pd。系列(np.array(y4))
数据=pd。DataFrame({1: y1, 2: y2, 3: y3, 4: y4,})
Data.boxplot() #在这里,熊猫有自己的处理流程,非常方便。
plt.ylabel(ylabel )
Plt.xlabel(xlabel) #我们设置横坐标和纵坐标的标题。
plt.show()
[效果]
上面的方框图很简单。给出数据后,可以生成几行代码,但这是一个简单的方框图。让我们来看看更复杂一点的东西。
2.使用matplotlib库绘制箱线图
我们已经介绍过用熊猫来画一个方框图,几个命令就够了。但是如果稍微复杂一点可以使用matplotlib库。Matplotlib代码稍微复杂一点,但是很灵活。细心的同学会发现,熊猫里的图纸也是基于这个库。这是熊猫的源代码:
通过源代码我们可以看到熊猫也是通过调用matplotlib来画图的。然后我们用matplotlib画一个箱线图。
我们来做一个简单的模拟,比较一下20岁到30岁的男生和女生的花销,用箱线图形象化。
[代码]
将numpy作为np导入
将matplotlib.pyplot作为plt导入
Fig,ax=plt.subplots() #子图
DEF _ GENERATOR (mean,dis,number): #封装这个函数以后生成数据。
返回np.random.normal (mean,dis * dis,number) #正态分布,输入参数为均值、标准差和生成量。
#我们为实验生成了四组数据,数据量分别为70-100。
#代表男生和女生分别在20岁和30岁时的支出分布。
girl20=list_generator(1000,29.2,70)
boy20=list_generator(800,11.5,80)
girl30=list_generator(3000,25.1056,90)
boy30=list_generator(1000,19.0756,100)
data=[女孩20,男孩20,女孩30,男孩30,]
ax .箱线图(数据)
Ax.set _ xticklabels ([girl20 , boy20 , girl30 ,]) #设置x轴刻度标签。
plt.show()
[效果]
从上面的随机模拟可以看出,男生在花费上赶不上女生,尤其是30岁以后,女生对男生的落差很大。(模拟数据,不要当真)
仔细看了上面这张图,还是觉得不太好。既然是比较男生女生,要不要分组,放在一起,然后按照年龄段来比较,这样比较直观。
那么我们稍微修改一下上面的代码,让男生和女生的箱线图靠得更近一些。
[代码]
将numpy作为np导入
将matplotlib.pyplot作为plt导入
Fig,ax=plt.subplots() #子图
DEF _ GENERATOR (mean,dis,number): #封装这个函数以后生成数据。
返回np.random.normal (mean,dis * dis,number) #正态分布,输入参数为均值、标准差和生成量。
#我们为实验生成了四组数据,数据量分别为70-100。
#代表男生和女生分别在20岁和30岁时的支出分布。
girl20=list_generator(1000,29.2,70)
boy20=list_generator(800,11.5,80)
girl30=list_generator(3000,25.1056,90)
boy30=list_generator(1000,19.0756,100)
data=[女孩20,男孩20,女孩30,男孩30,]
#用positions参数设置每个方框图的位置。
Ax.boxplot (data,positions=[0,0.6,3,3.7,]) #是在它后面添加的位置。
Ax.set _ xticklabels ([girl20 , boy20 , girl30 ,]) #设置x轴刻度标签。
plt.show()
[效果]
让我们看一看。男生女生是按年龄段分组的吗?比上面的稍微好看直观一点。这样不仅可以看到年龄段的对比,也可以看到男生女生的对比。
类似地,如果您希望箱线图旋转90,您也可以将参数vert=False添加到boxplot命令中。如果需要更多设置,可以根据箱线图函数参数进行修改。其功能定义如下:
箱线图(self,x,notch=None,sym=None,vert=None,whis=None,
位置=无,宽度=无,patch _ artist=无,
bootstrap=None,usermedians=None,conf_intervals=None,
meanline=无,showmeans=无,showcaps=无,
showbox=无,showfliers=无,boxprops=无,
labels=None,flierprops=None,medianprops=None,
meanprops=None,capprops=None,whiskerprops=None,
manage_xticks=True,autorange=False,zorder=None)
3.使用seaborn库和matplotlib绘制箱线图
Seaborn是一个基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图。其实Born是基于matplotlib加上更高级的API包,让画图变得更简单,不需要大量调整就能让你的画图变得精致。但需要强调的是,Seaborn应该被视为matplotlib的补充,而不是替代品。
函数定义:
box plot(x=无,y=无,hue=无,data=无,order=无,hue _ order=无,
orient=None,color=None,palette=None,saturation=.75,
width=.8,dodge=True,fliersize=5,linewidth=None,
whis=1.5,notch=False,ax=None,**kwargs)
【参数说明】x,y:y:data frame中的列名(str)或矢量数据
数据:数据帧或数组
调色板:调色板,控制图像的色调。
hue(str):data frame的列名,根据列名中的值进行分类,形成分类条形图。
Order,hue_order(字符串列表):用于控制条形图的顺序。
Orient: v h 用于控制图像是水平显示还是垂直显示(这通常是从输入变量的dtype中推断出来的,当只输入数据而不是X和Y时,通常使用此参数)
Fliersize:float,用于表示异常值观察的标记大小。
WHI:确定异常值的上下限(IQR超过高低四分位数之比),超出此范围的点将被标识为异常值。智商是指上四分位数和下四分位数之间的差异。
Width:float,控制盒图的宽度。
我们还是以上面的男女消费案例为基础,但是这里我们整理了数据,做了一个dataframe Dataframe。
[包含的库]
进口熊猫作为pd
将numpy作为np导入
将seaborn作为sns导入
将matplotlib.pyplot作为plt导入
# plt.rc (font ,family= simhei ,size= 15 )避免中文乱码,不用。
[代码第1部分]数据生成
DEF _ GENERATOR (mean,dis,number): #封装这个函数以后生成数据。
返回np.random.normal (mean,dis * dis,number) #正态分布,输入参数为均值、标准差和生成量。
#我们为实验生成了四组数据,数据量分别为70-100。
#代表男生和女生分别在20岁和30岁时的支出分布。
#构建数据库数据框架
数量=100 #每组100个样本
girl20=list_generator(1000,29.2,数字)
boy20=list_generator(800,11.5,num)
girl30=list_generator(3000,25.1056,数字)
boy30=list_generator(1000,19.0756,num)
girl_sex=[女性 for _ in range(num)]
boy_sex=[男性 for _ in range(num)]
年龄20=[范围内的20岁(数量)]
年龄30=[范围内的30岁(数量)]
girl_d1=pd。DataFrame({cost: girl20, sex: girl_sex, age: age20})
boy_d1=pd。DataFrame({cost: boy20, sex: boy_sex, age: age20})
girl_d2=pd。DataFrame({cost: girl30, sex: girl_sex, age: age30})
boy_d2=pd。DataFrame({cost: boy30, sex: boy_sex, age: age30})
data=PD . concat([女孩_d1,男孩_d1,女孩_d2,男孩_d2])
print(data.head())
数据是什么样的?这是给定数据框的前面部分。总共有400个样本,分性别和年龄。
[代码第2部分]使用seaborn库绘图
简单地看一下所有数据的分布:
sns.boxplot(x=age ,y=cost ,data=data,hue=sex ,width=0.5,linewidth=1.0,palette=Set3 )
按性别分组:
sns.boxplot(x=age ,y=cost ,data=data,hue=sex ,width=0.5,linewidth=1.0,palette=Set3 )
根据年龄组:
sns.boxplot(x=sex ,y=cost ,data=data,hue=age ,width=0.5,linewidth=1.0,palette=Set3 )
以上是seaborn库的简单用法。可以按年龄对比男女的花费,也可以按性别对比不同年龄段的花费,还是比较直观的。当然还有很多其他的招数,你可以自己试试。
摘要
从上面来看,虽然我们用不同的方法绘制盒图,但最基本的还是调用matplotlib库,其中pandas是盒图最简单的可视化,但并不灵活。Matplotlib比较灵活,但是需要慢慢调整,比较复杂。相比之下,seaborn更酷,画面更好看。以上例子都是个人测试,对比,原创文章。如有其他问题,欢迎留言讨论。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。