绘制频率分布直方图的三种方法,总结的很用心

绘制频率分布直方图的三种方法,总结的很用心直方图能帮助迅速了解数据的分布形态 将观测数据分组 并以柱状条表示各分组中观测数据的个数

大家好,欢迎来到IT知识分享网。

直方图能帮助迅速了解数据的分布形态,将观测数据分组,并以柱状条表示各分组中观测数据的个数。简单而有效的可视化方法,可检测数据是否有问题,也可看出数据是否遵从某种已知分布。

本次案例通过生成深圳市疫情个案数据集中所有患者的年龄参数直方图。

分别使用Matplotlib、Pandas、Seaborn模块可视化Histogram。

其中,Matplotlib和Pandas样式简单,看上去吸引力不大。Seaborn可往单变量直方图上添加很多东西,更美观,pandas可成组生成直方图。

导入库/数据

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import datetime import time df=pd.read_excel(r"szdata.xls") df.head(5) 

Matplotlib模块

注意原始数据集不能存在缺失值,绘制前必须对缺失数据删除或替换,否则无法绘制成功. 检查年龄是否有缺失 any(df.年龄.isnull()) #False 删除含有缺失年龄的数据 df.dropna(subset=["年龄"],inplace=True) 绘制直方图 plt.rcParams["font.sans-serif"]='SimHei' plt.rcParams['axes.unicode_minus']=False %config InlineBackend.figure_format='svg' plt.hist(x=df.年龄,bins=20, color="steelblue", edgecolor="black") #添加x轴和y轴标签 plt.xlabel("年龄") plt.ylabel("病例数") #添加标题 plt.title("患者年龄分布") #显示图形 plt.show() 

在这里插入图片描述

Pandas模块

#注意直方图上添加核密度图,必须将直方图频数更改为频率,即normed参数设置成True #直方图 df.年龄.plot(kind="hist",bins=20,color="steelblue",edgecolor="black",normed=True,label="直方图") #加核密度图 df.年龄.plot(kind="kde",color="red",label="核密度图") #添加x轴和y轴标签 plt.xlabel("年龄") plt.ylabel("核密度值") #添加标题 plt.title("患者年龄分布") #显示图例 plt.legend() #显示图形 plt.show() 

在这里插入图片描述

# pandas.cut() 也同样是一个方便的方法,用来将数据进行强制的分箱 # 将一系列数值分成若干份 #cut()方法,参数bin指明切分区间,左开右闭区间。 import numpy as np from pandas import Series,DataFrame ages=list(df.年龄) bins=[0,29,39,49,50,np.inf] #范围 labels=["少年","青年组","中青年组","中年组","中老年组"] groups=pd.cut(ages,bins=bins,labels=labels) data=groups.value_counts() #qcut()方法,不需要事先指明切分区间,只需要指明切分个数。 # pd.qcut(ages,6).value_counts() df1=DataFrame(data,columns=["病例数"]) plt.subplot(1,1,1) x=labels y=df1["病例数"].values plt.bar(x,y,width=0.5,align="center") plt.title("深圳市患者按年龄分组",loc="center") for a,b in zip(x,y): plt.text(a,b,b,ha="center",va="bottom",fontsize=12)#添加数据标签 plt.ylim(0,140) plt.xlabel('分组',labelpad=10) plt.ylabel('病例数') plt.savefig(r"bar.jpg") # 条形图 # 将柱形图x轴和y轴调换,barh方法 # plt.barh(y,width,height,align,color,edgecolor) 

在这里插入图片描述

pandas也提供了一个方便的.value_counts() 方法,用来计算一个非空值的直方图,并将之转变成一个pandas的series结构:df.年龄.value_counts()

Seaborn模块

# 上面表达了所有患者的年龄分布,如果按性别分组, # 研究不同性别下年龄分布的差异,该如何实现叻?针对这个问题,推荐使用Seaborn模块中的distplot函数 #取出男性年龄 Age_Male=df.年龄[df.性别=="男性"] #取出女性年龄 Age_Female=df.年龄[df.性别=="女性"] #绘制男女患者年龄的直方图 sns.distplot(Age_Male,bins=20,kde=False,hist_kws={"color":"steelblue"},label="男性") #绘制男女患者年龄的直方图 sns.distplot(Age_Female,bins=20,kde=False,hist_kws={"color":"purple"},label="女性") #添加标题 plt.title("不同性别患者年龄分布直方图") #显示图例 plt.legend() #显示图形 plt.show() 

在这里插入图片描述

#绘制核密度函图 #绘制男女患者年龄的直方图 sns.distplot(Age_Male,hist=False,kde_kws={"color":"red","linestyle":"-"},norm_hist=True,label="男性") #绘制男女患者年龄的直方图 sns.distplot(Age_Female,hist=False,kde_kws={"color":"blue","linestyle":"--"},norm_hist=True,label="女性") #添加标题 plt.title("不同性别患者年龄核密度图") #显示图例 plt.legend() #显示图形 plt.show() 

在这里插入图片描述

Python实现histogram方法

#生成直方图 # count_elements() 返回了一个字典,字典里的键值对:所有数值出现的频率次数。 # hist[i] = hist.get(i, 0) + 1 实现了每个数值次数的累积 a = tuple(df.年龄) def count_elements(seq) -> dict: hist = {} for i in seq: hist[i] = hist.get(i, 0) + 1 return hist counted = count_elements(a) counted #或通过collection.Counter类库实现 # from collections import Counter # counted = Counter(a) # counted #利用输出格式format来实现直方图的展示 def histogram(seq) -> None: counted = count_elements(seq) for k in sorted(counted): print('{0:5d} {1}'.format(k, '@' * counted[k])) histogram(a) 

在这里插入图片描述

附函数语法及参数含义

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125960.html

(0)
上一篇 2025-09-22 19:10
下一篇 2025-09-22 19:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信