用python绘制箱线图,python箱线图怎么看

  用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: