热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

分别使用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,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)

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

                   

附函数语法及参数含义

Matplotlib模块中hist函数

Plt.hist(x,bins=10,range=None,normed=False,weights=None,cumulative=False,bottom=None,histtype=’bar’,align=’mid’,orientation=’vertical’,rhttps://img8.php1.cn/3cdc5/12381/711/1c445f7008953e4d.png" src="https://img8.php1.cn/3cdc5/12381/711/1c445f7008953e4d.png" alt="《绘制频率分布直方图的三种方法,总结的很用心!》" />


推荐阅读
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 深入解析Python文本数据处理的技巧与方法
    学习Python时,它总能让人深刻体会到这款语言的魅力。今天小编为大家带来一个有趣的项目,用Python处理文本数据,一起来看看今天的问题吧 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Spring Boot 中 Java8 LocalDateTime 序列化问题
    LoginController页面如下:publicObjectlogin(@RequestBodyUseruser){returnxxxx ... [详细]
  • 目录4.1.type数据类型检测 ... [详细]
  • Python之基础篇(三)
    基础篇之三:一,数据类型之set.总结:set无序,不重复。1,创建set:s{1,2,3}print(s,type(s))list1[1,2,3]s1(list1)prin ... [详细]
  • 这篇文章主要讲解了“怎么用Python写一个电信客户流失预测模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
蚊子爱的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有