在上篇文章(matplotlib库绘制折线图、条形图)中,我们已经学习了用matplotlib绘制折线图、子图及柱状图,那么本篇文章,我们继续学习绘制散点图、直方图、和箱线图。
首先,在绘制这几种图形之前,我们来了解下各种图形的概念及特点。
- 散点图:散点图是指在回归分析中,数据点在直角坐标系平面上的分布图,散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。主要考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
- 直方图:是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。在这里,大家需要区分条形图(柱状图)与直方图的区别。条形图是用条形的长度表示各类别频数的多少,其宽度则是固定的;直方图是用面积表示各组频数的多少.矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度宽度均有意义;由于分组数据具有连续性,直方图的各矩形通常是连续排列,而条形图是分开排列;条形图主要用于展示分类数据.直方图主要用于展示数值型数据
- 箱型图:也称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图,它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较,它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。
下面,我们用python代码依次实现这些统计图。
绘制散点图
绘制散点图,主要用到plt.scatter()这个函数,那么首先看下这个函数参数:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)
可以看到x,y是必填参数,在这里x,y就是我们需要传入的数据,其他参数都是可选参数,在这里我们只需要了解下c(颜色:b--blue, c--cyan,g--green,k--black,m--magenta,r--red,w--white,y--yellow)参数、s参数(控制点的大小,默认为20)和marker(指定散点图点的形状,默认为圆形)参数。
1、用numpy造输入数据
import numpy as np x=np.random.random(100)*10#这里可以理解为美团用户A对100个菜品的评分 y=np.random.random(100)*10#这里可以理解为美团用户B对100个菜品的评分
2、传入输入数据,绘制出散点图,如图
import matplotlib.plot as plt plt.scatter(x,y) plt.show()
3、优化散点图(设置颜色、设置点的大小、设置图的纵横坐标名称和标题)
area=np.random.random(10)*50#让点的面积随机在这10个数之间 plt.xlabel('B')#设置横坐标名称 plt.ylabel('A')#设置纵坐标名称 plt.title('User ratings')#设置标题 plt.scatter(x,y,s=area,c='y') plt.show()
绘制直方图
绘制直方图,主要用plt.hist()这个函数,依照惯例,我们还是先看下这个函数有哪些参数。
matplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
x:这个参数是指定每个bin(箱子)分布的数据,对应x轴
bins:这个参数指定bin(箱子)的个数,也就是总共有几条条状图
normed:这个参数指定密度,也就是每个条状图的占比例比,默认为1
color : 这个指定条状图的颜色
1、造输入数据
import numpy as np x=np.random.random(low=0,hight=10,size=10)#这里可以理解为美团用户A对10个菜品的评分
2、传入参数,绘制直方图
import matplotlib.pyplot as plt plt.hist(x)
从这个直方图上大家也可以看出柱状图和直方图的区别,可以从图中看出,评分4分占了3次,比重最大。
3、优化直方图(设置bins、颜色、坐标名称和图标题)
上面这个图数据量较少,只有10条数据,我们很容易看出每个评分的频数,但如果有1000条数据,我们想看看这1000条数据中,每个评分的频次,并且对评分做一个分组展示,该如何去做?
1、用numpy创建1000个样本数据,并统计每个样本数据的频数(注意这里统计每个评分的频数是为了验证,最终传入的变量是x,而不是bin)
import numpy as np import pandas as pd #生成1000个0-10的样本数据 x=np.random.randint(low=0,high=10,size=1000) #将numpy行向量转成DF,以便用value_counts()统计每个评分出现的次数 df=pd.DataFrame({'a':x}) #统计次数,返回序列 cn=df['a'].value_counts() #对每个评分做排序 bin=cn.sort_index() print(bin)
plt.hist(x) plt.show()
通过直方图可以看到,不设置bins时,每个评分值作为一组,且每个评分对应的次数与我们统计的bin变量一致。
2、传入生成的数据,并设置bins
#这里我们设置bins为4,即将评分分为优、良、中、差四个等级 plt.hist(x,bins=5, range=(0, 10)) plt.show()
3、优化直方图(设置颜色、纵横坐标名称、标题和图例)
plt.hist(x,bins=4,color='y',range=(0, 10)) plt.xlabel("score") plt.ylabel("count") plt.title('Grade distribution') plt.show()
绘制箱线图
绘制箱线图,用plt.boxplot()这个函数。那先看下这个函数的参数有哪些
plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None,meanline=None,showmeans=None, showcaps=None,showbox=None,showfliers=None, boxprops=None,labels=None,flierprops=None,medianprops=None,meanprops=None, capprops=None,whiskerprops=None)
这个函数参数比较多,但是必填参数跟直方图一样,只需要传入数据参数x.所以这里我们直接使用直方图的数据,直接绘制出箱线图。
figure, ax = plt.subplots() plt.boxplot(x) plt.xlabel("user") ax.set_xticklabels('A') plt.ylabel("score") plt.title('Grade distribution') plt.show()
由于这里是随机生成的1000个0-10之间的数据,所以看不到离群点,为了看到离群点,我们加一些脏数据看看效果。
import numpy as np import pandas as pd #生成1000个0-10的样本数据 x=np.random.randint(low=0,high=10,size=1000) #增加3个11到20之间的数据 xmax=np.random.randint(low=11,high=20,size=3) #增加3个-15到-1之间的数据 xmin=np.random.randint(low=-15,high=-1,size=3) #合并三个数组 x=np.append(np.append(x,xmin),xmax) #将numpy行向量转成DF,以便用value_counts()统计每个评分出现的次数 df=pd.DataFrame({'a':x}) cn=df['a'].value_counts()#统计次数,返回序列 bin=cn.sort_index()#对每个评分做排序 print(bin)
figure, ax = plt.subplots() plt.boxplot(x) plt.xlabel("user") ax.set_xticklabels('A') plt.ylabel("score") plt.title('Grade distribution') plt.show()
总结,本篇文章,我们分别完成了散点图、直方图和箱型图的绘制,说白了就是学习了三个函数:plt.scatter()、plt.hist()、plt.boxplot()。下个主题我将继续讲解seaborn库的一些用法,喜欢的小伙伴请点击关注!