查看原文
其他

【Python菜鸟进阶大神】Matplotlib数据可视化005:直方图

老杨啊小强 Python数据科学修炼之路 2021-08-09


前文回看:

【Python菜鸟进阶大神】Matplotlib数据可视化001:基础API汇总&散点图

【Python菜鸟进阶大神】Matplotlib数据可视化002:折线图

【Python菜鸟进阶大神】Matplotlib数据可视化003:条形图

【Python菜鸟进阶大神】Matplotlib数据可视化004:饼图


直方图用来描述连续变量(定量变量)的分布情况,横轴表示数据类型,纵轴表示分布情况


直方图的API:

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)

  • x:指定要绘制直方图的数据;

  • bins:指定直方图条形的个数;

  • range:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;

  • normed:是否将直方图的频数转换成频率;

  • weights:该参数可为每一个数据点设置权重;

  • cumulative:是否需要计算累计频数或频率;

  • bottom:可以为直方图的每个条形添加基准线,默认为0;

  • histtype:指定直方图的类型,默认为bar,除此还有’barstacked’,‘step’, ‘stepfilled’;

  • align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’;

  • orientation:设置直方图的摆放方向,默认为垂直方向;

  • rwidth:设置直方图条形宽度的百分比;

  • log:是否需要对绘图数据进行log变换;

  • color:设置直方图的填充色;

  • label:设置直方图的标签,可通过legend展示其图例;

  • stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放;

首先,我们加载数据:

数据来源:https://pan.baidu.com/s/1lEV_mMQZVPCrShH9ku_TYw(d6gr)

# 引入模块import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as plt# 中文乱码和坐标轴负号的处理plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['axes.unicode_minus'] = False# 加载数据path="C:/Users/Administrator/Desktop/exercise_data/train.csv"df=pd.read_csv(path)df.head()df["Age"].isnull()    #检查age变量是否含有缺失值df.dropna(subset=["Age"],inplace=True)    # 删除掉age列含有缺失值对应的所有行



plt.hist(df["Age"], #绘图数据 bins=20, #多少个条 color="blue", #颜色 label="年龄", #标签,用以图例legend histtype="bar", #直方图的样式 normed =False, #频数 edgecolor = 'white' # 指定直方图条形的边界色 )plt.title("泰坦尼克号乘客年龄分布",fontdict={'fontsize':18, 'color':'r'})plt.xlabel("Age")plt.ylabel("频数")# 显示图例plt.legend(loc = 'best')# 显示图形plt.show()


plt.hist(df["Age"], #绘图数据         bins=np.arange(df.Age.min(),df["Age"].max(),5),    #从age的最小值到最大值,步长为5 color="blue", #颜色 label="年龄", #标签,用以图例legend histtype="bar", #直方图的样式 normed =True, #频数变为频率 edgecolor = 'white' # 指定直方图条形的边界色 )plt.title("泰坦尼克号乘客年龄分布",fontdict={'fontsize':18, 'color':'r'})plt.xlabel("Age")plt.ylabel("频率")# 显示图例plt.legend(loc = 'best')# 显示图形plt.show()

参数cumulative = True, 则是积累直方图,上图右所示。

import matplotlib.mlab as mlabfrom scipy.stats import normplt.hist(df["Age"], #绘图数据 bins=np.arange(df.Age.min(),df["Age"].max(),5), #多少个条 color="blue", #颜色 label="年龄", #标签,用以图例legend histtype="bar", #直方图的样式 normed =True, #频数变为频率 edgecolor = 'white' # 指定直方图条形的边界色 )plt.title("泰坦尼克号乘客年龄分布",fontdict={'fontsize':18, 'color':'r'})plt.xlabel("Age")plt.ylabel("频率")# 生成正态曲线的数据x1 = np.linspace(df.Age.min(), df.Age.max(), 1000)normal = norm.pdf(x1, df.Age.mean(), df.Age.std())# 绘制正态分布曲线line1,= plt.plot(x1,normal,'r-', linewidth = 2) # 生成核密度曲线的数据kde = mlab.GaussianKDE(df.Age)x2 = np.linspace(df.Age.min(), df.Age.max(), 1000)# 绘制line2, = plt.plot(x2,kde(x2),'k-.', linewidth = 2)# 显示图例plt.legend([line1,line2],["正态分布曲线","核密度曲线"],loc="best")

注意:

都知道x服从~N(μ,σ^2),就是正态分布;μ=1,σ^2=0,是标准正态分布。

生成正态概率密度:

y1=mlab.normpdf(x,mu均值,sigma标准差),或者

y2=norm.pdf(x,mu均值,sigma标准差) 


两个变量的直方图

在年龄的基础上,将男性和女性区分出来

# 提取不同性别的年龄数据age_female = df.Age[df.Sex == 'female']age_male = df.Age[df.Sex == 'male']# 设置直方图的组距bins = np.arange(df.Age.min(), df.Age.max(), 3)# 男性乘客年龄直方图plt.hist(age_male, bins = bins, label = '男性', color = 'blue', alpha =1)# 女性乘客年龄直方图plt.hist(age_female, bins = bins, label = '女性', color = 'y',alpha = 0.8)# 设置坐标轴标签和标题plt.title('泰坦尼克号乘客年龄-按性别分布',fontdict={'fontsize':18, 'color':'r'})plt.xlabel('年龄',fontdict={'fontsize':18, 'color':'k'})plt.ylabel('人数',fontdict={'fontsize':18, 'color':'k'})
# 显示图例plt.legend()# 显示图形plt.show()

上图显示的总体还是年龄的分布,男女年龄的均值和标准差没有太大的差异,所以两个图是重叠在一起的。

都知道,均值反映集中趋势,体现总体的情况中大部分的量是多少。

标准差反映离散程度,方差的开平方,反映每个样本和总体均数的差异,方差越大越离散,也就是正态曲线峰越低。

在用一组数据和图形体现:

# 构造数据mu1,sigma1=80,30mu2,sigma2=30,15x1=mu1+sigma1*np.random.randn(10000)x2=mu2+sigma2*np.random.randn(10000)# 画图plt.hist(x1,bins=50,density=True,color="r",alpha=1)plt.hist(x2,bins=50,density=True,color="b",alpha=0.7)# 加数据标签plt.text(90,0.013,r"$\mu=80,\ \sigma=30$",fontdict={'fontsize':13,'color':'r','weight':'bold','family':'serif'})plt.text(35,0.025,r"$\mu=30,\ \sigma=15$",fontdict={'fontsize':13,'color':'k'})# 设置x轴的范围plt.xlim(-15,170)# 标题plt.title("均值和标准差不同的直方图比较",fontdict={'fontsize':20,'color':'k'})

好了今天的分享就到这里了,拜拜┏(^0^)┛!

公众号:ywq885889


参考:https://www.kesci.com/home/project/59f6f21bc5f3f511952c2966



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存