分布(一)利用python绘制直方图

分布(一)利用python绘制直方图

直方图(Histogram)简介

直方图

直方图主要用来显示在连续间隔(或时间段)的数据分布,每个条形表示每个间隔(或时间段)的频率,直方图的总面积等于数据总量。

直方图有助于分析数值分布的集中度、上下限差异等,也可粗略显示概率分布。

快速绘制

  1. 基于seaborn

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # 导入数据
    df = sns.load_dataset('iris')
    
    # 利用displot函数创建直方图
    sns.displot(df["sepal_length"], kde=False, rug=False)
    
    plt.show()
    

    直方图

  2. 基于matplotlib

    import matplotlib.pyplot as plt
    
    # 导入数据
    df = sns.load_dataset('iris')
    
    # 初始画布
    fig, ax = plt.subplots(figsize = (4, 3))
    
    # 利用hist创建直方图
    ax.hist(df["sepal_length"], edgecolor="black")
    
    plt.show()
    

    直方图

定制多样化的直方图

自定义直方图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。

以下直方图的自定义只是冰山一角,尽管如此依然显得很多很杂。过多的代码容易造成阅读体验的下降,因此我也曾考虑过将这部分以源代码的形式分享给大家,文章只叙述相关的操作和结果图,尽可能地提高大家的阅读体验。

但是我又想到并不是所有的图表内容都如此庞大,简单的图表就会显得文章过于单薄。而且单纯的放图好像也并不能提高阅读体验。

另外,大家也知道我从来不分享原始代码的文件,因为现在大家的学习节奏都很快,一旦拿到文件基本就放到一边了。只有将这些代码复制下来,哪怕只跑一遍也会有一定的印象,从而提高技术能力。

通过seaborn绘制多样化的直方图

seaborn主要利用displothistplot绘制直方图,可以通过seaborn.displot和seaborn.histplot了解更多用法

  1. 修改参数

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    sns.set(font='SimHei', font_scale=0.8, style="darkgrid") # 解决Seaborn中文显示问题
    
    
    # 导入数据
    df = sns.load_dataset("iris")
    
    # 构造子图
    fig, ax = plt.subplots(2,2,constrained_layout=True, figsize=(12, 8))
    
    # 自定义分箱数量
    ax_sub = sns.histplot(data=df, x="sepal_length", bins=20, ax=ax[0][0])
    ax_sub.set_title('自定义分箱数量')
    
    # 增加密度曲线
    ax_sub = sns.histplot(data=df, x="sepal_length", kde=True, ax=ax[0][1])
    ax_sub.set_title('添加kde')
    
    # 增加密度曲线和数据分布(小短条)
    # rug参数用于绘制出一维数组中数据点实际的分布位置情况,单纯的将记录值在坐标轴上表现出来
    ax_sub = sns.histplot(data=df, kde=True, x="sepal_length", ax=ax[1][0])
    sns.rugplot(data=df, x="sepal_length", ax=ax_sub.axes)
    ax_sub.set_title('添加kde+rug')
    
    # 自定义密度曲线+自定义数据分布(kde+rug)
    ax_sub = sns.histplot(data=df, x="sepal_length", stat="density", ax=ax[1][1])
    sns.kdeplot(data=df, x="sepal_length", color="g", linewidth=5, alpha=0.3, ax=ax_sub.axes)
    sns.rugplot(data=df, x="sepal_length", color="r", linewidth=2, alpha=0.3, height=0.2, ax=ax_sub.axes)
    ax_sub.set_title('自定义kde+rug')
    
    plt.show()
    

    1

  2. 绘制多个变量

    • 一图绘制多个变量

      import seaborn as sns
      import matplotlib.pyplot as plt
      
      sns.set(font='SimHei', font_scale=0.8, style="darkgrid") # 解决Seaborn中文显示问题
      
      # 导入数据
      df = sns.load_dataset("iris")
      
      sns.histplot(data=df, x="sepal_length", color="skyblue", label="Sepal Length", kde=True)
      sns.histplot(data=df, x="sepal_width", color="red", label="Sepal Width", kde=True)
      
      plt.legend() 
      plt.show()
      

      2

      # 引申-镜像直方图:可用来对比两个变量的分布
      
      import numpy as np
      from numpy import linspace
      import pandas as pd
      import seaborn as sns
      import matplotlib.pyplot as plt
      from scipy.stats import gaussian_kde
      
      # 自定义数据
      df = pd.DataFrame({
      'var1': np.random.normal(size=1000),
      'var2': np.random.normal(loc=2, size=1000) * -1
      })
      
      # 初始画布
      plt.rcParams["figure.figsize"]=12,8
      
      # 绘制直方图1
      sns.histplot(x=df.var1, stat="density", bins=20, edgecolor='black')
      
      # 绘制直方图2
      n_bins = 20
      # 获取条形的位置和高度
      heights, bins = np.histogram(df.var2, density=True, bins=n_bins) 
      # 乘以-1进行反转
      heights *= -1
      bin_width = np.diff(bins)[0]
      bin_pos =( bins[:-1] + bin_width / 2) * -1
      
      # 绘制镜像图
      plt.bar(bin_pos, heights, width=bin_width, edgecolor='black')
      
      plt.show()
      

      download

    • 子图绘制多个变量

      import seaborn as sns
      import matplotlib.pyplot as plt
      
      sns.set(font='SimHei', font_scale=0.8, style="darkgrid") # 解决Seaborn中文显示问题
      
      # 导入数据
      df = sns.load_dataset("iris")
      
      fig, axs = plt.subplots(2, 2, figsize=(7, 7))
      
      sns.histplot(data=df, x="sepal_length", kde=True, color="skyblue", ax=axs[0, 0])
      sns.histplot(data=df, x="sepal_width", kde=True, color="olive", ax=axs[0, 1])
      sns.histplot(data=df, x="petal_length", kde=True, color="gold", ax=axs[1, 0])
      sns.histplot(data=df, x="petal_width", kde=True, color="teal", ax=axs[1, 1])
      
      plt.show()
      

      3

  3. 直方图与其它图的组合

    • 直方图+箱线图 :箱线图辅助理解数据分布并可视化展示四分位数及异常值

      import seaborn as sns
      import matplotlib.pyplot as plt
      sns.set(style="darkgrid")
      
      # 导入数据
      df = sns.load_dataset("iris")
      
      f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (.15, .85)})
      sns.boxplot(x=df["sepal_length"], ax=ax_box)
      sns.histplot(data=df, x="sepal_length", ax=ax_hist)
      
      ax_box.set(xlabel='')
      plt.show()
      

      4

    • 直方图+散点图 :散点图可以观测两个变量的关系,直方图能够更好的展示数据分布

      import seaborn as sns
      import matplotlib.pyplot as plt
      df = sns.load_dataset('iris')
      
      sns.jointplot(x=df["sepal_length"], y=df["sepal_width"], kind='scatter')
      
      
      plt.show()
      

      5

    • 引申-绘制边缘图

      因为jointplot是一个需要全幅度的图形级别函数,故不能在 subplots 子图中使用。这里采用自定义SeabornFig2Grid将 Seaborn生成的图转为matplotlib类型的子图。详细参考How to plot multiple Seaborn Jointplot in Subplot。

      同样的jointplot也有很多参数可以自定义,并且可以使用更为灵活的JointGrid。这里就不赘述了,详细可以参考seaborn.jointplot和seaborn.JointGrid。

      import matplotlib.pyplot as plt
      import matplotlib.gridspec as gridspec
      import seaborn as sns
      # 导入自定义模块
      import SeabornFig2Grid as sfg
      
      
      # 加载数据
      df = sns.load_dataset('iris')
      
      # 创建 Seaborn JointGrid 对象
      g1 = sns.jointplot(x=df["sepal_length"], y=df["sepal_width"], kind='reg') # 带回归线的散点图
      g2 = sns.jointplot(x=df["sepal_length"], y=df["sepal_width"], kind='kde') # 核密度估计图
      g3 = sns.jointplot(x=df["sepal_length"], y=df["sepal_width"], kind='hex') # 六边形核密度估计图
      
      # 创建高级边缘图-边缘图叠加
      g4 = sns.jointplot(x=df["sepal_length"], y=df["sepal_width"],
                     color='g',
                     kind='reg').plot_joint(sns.kdeplot, zorder=0, n_levels=10)
      
      # 创建 matplotlib 图和子图布局
      fig = plt.figure(figsize=(12,8))
      gs = gridspec.GridSpec(2, 2)
      
      # 使用SeabornFig2Grid转换 seaborn 图为 matplotlib 子图
      mg1 = sfg.SeabornFig2Grid(g1, fig, gs[0])
      mg2 = sfg.SeabornFig2Grid(g2, fig, gs[1])
      mg3 = sfg.SeabornFig2Grid(g3, fig, gs[2])
      mg4 = sfg.SeabornFig2Grid(g4, fig, gs[3])
      
      gs.tight_layout(fig) # 调整整个布局
      plt.show()
      

      6

通过matplotlib绘制多样化的直方图

matplotlib主要利用hist绘制直方图,可以通过matplotlib.pyplot.hist了解更多用法

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np 

mpl.rcParams.update(mpl.rcParamsDefault) # 恢复默认的matplotlib样式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签

# 自定义数据
hours = [17, 20, 22, 25, 26, 27, 30, 31, 32, 38, 40, 40, 45, 55]

# 初始化
fig, ax = plt.subplots(2,2,constrained_layout=True, figsize=(12, 8))

# 指定分箱数量
ax[0, 0].hist(hours)
ax[0, 0].set_title('自定义分箱数量')

# 设置边缘线
ax[0, 1].hist(hours, bins=5, edgecolor="black")
ax[0, 1].set_title('设置边缘线')

# 自定义分箱
bins = [20, 30, 40, 50, 60]
ax[1, 0].hist(hours, bins=bins, edgecolor="black")
ax[1, 0].set_title('自定义分箱')

# 添加额外数据信息:中位数
median_hour = np.median(hours)
ax[1, 1].hist(hours, bins=5, edgecolor="black")
ax[1, 1].axvline(median_hour, color="black", ls="--", label="Median hour")
ax[1, 1].legend()
ax[1, 1].set_title('添加中位数')

plt.show()

7

总结

以上通过seaborn的displot和matplotlib的hist可以快速绘制直方图,并通过修改参数或者辅以其他绘图知识自定义各种各样的直方图来适应相关使用场景。

共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/372457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年考PMP还有什么用?

PMP 是项目管理专业人士资格认证的意思,也是项目管理领域通用的证书, 做项目的基本都会去考。 要说 PMP 有啥作用? 个人感觉 PMP 证书更多的是跳槽、转行的敲门砖的作用,因为现在很多公司都要 PMP 证书,有了可以加分…

VS Code+Live Server插件开发游戏并结合内网穿透分享好友异地访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…

springboot157基于springboot的线上辅导班系统的开发与设计

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

fastapi 链接数据库,并报错问题

还有一个重点需要下载 pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simplefrom fastapi import FastAPI import uvicorn from student.urls import student_id_mysql from sqlalchemy …

【sentinel流量卫兵配置持久化到Nacos】

sentinel流量卫兵配置持久化到Nacos 概述: 一、添加配置二、配置说明限流规则配置:降级规则配置:热点规则配置:授权规则配置:系统规则配置: 三、服务整合 概述: 控制台配置的参数,默…

2024/2/4学习记录

微信小程序 网络数据请求 出于安全性方面的考虑,小程序官方对数据接口得请求做出了俩个限制 只能对 https 类型的接口必须将接口的域名添加到信任列表中 需要去这里设置 域名只支持 https 协议域名不能使用 ip 地址 或者localhost域名必须经过 ICP 备案 服务器域…

【C++】基础语法:深浅拷贝

前言 在学习拷贝构造函数的时候遇到了深浅拷贝这个知识点 就写篇文章记录一下 (引用的部分不用太在意 是查的 (需要前提知识:知道默认拷贝构造函数是什么 知道默认拷贝构造函数和构造函数的关系、知道析构函数的写法和用处 浅拷贝 浅拷贝&…

周报(20240204)

日期:2024.1.29 - 2024.2.4 本周工作: 1. 阅读论文 本周主要对这篇文献进行了阅读: 《用可学习的跳跃连接缩小U-Net中的语义差距:以医学图像分割为例》 背景 医学图像分割和随后对目标对象的定量评估为疾病诊断和治疗规划提…

在Vue中如何动态绑定class和style属性

在Vue中,动态绑定class和style属性是我们经常遇到的需求。这个功能允许我们根据不同的条件来动态改变元素的样式,让我们的应用更加灵活和富有交互性。在本篇博客文章中,我将带你深入探索在Vue中如何实现这一功能。 首先,让我们了…

c++中使用ifstream对文件按照行间隔或者符号间隔来读取

简单的文本存取与读取在的程序中是比较常见的,一般为了读取的时候便于区分数据,我们常常会用空格或者空行来隔开数据字段,所以对于读取文件的操作我们肯定会有些具体的需求比如按照行读取或者按照词来读取(或者说是以空格来间隔数…

函数调用栈是什么

今天在力扣leetbook上看《图解算法数据结构》中的空间复杂度这一小节,看到如下这句话: “程序调用函数是基于栈实现的,函数在调用期间,占用常量大小的栈帧空间,直至返回后释放。” 这句话的意思是,在程序中…

SQL必知必会笔记(13~16章)

第十三章 创建高级联结 1、别名:缩短SQL语句,允许在一条Select语句中多次使用相同的表 SELECT A.Name, A.Maths, A.English FROM transcript AS A INNER JOIN student_id As B ON A.Name B.Name; 2、Oracle数据库中没有AS关键字,直接在表名或…

【计算机学院寒假社会实践】——服务走进社区,共绘幸福蓝图

为深入贯彻落实志愿者服务精神,扎实推进志愿者服务质量,2024年1月28日,曲阜师范大学计算机学院“青年扎根基层,服务走进社区”社会实践队队员周兴睿在孙宇老师的指导下,来到山东省滨州市陈集街道社区开展了为期一天的“…

Unity_ShaderGraph节点问题

Unity_ShaderGraph节点问题 Unity版本:Unity2023.1.19 为什么在Unity2023.1.19的Shader Graph中找不见PBR Master节点? 以下这个PBR Maste从何而来?

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势: 服务解耦 性能提升,吞吐量提高 服务没有强依赖,不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高,所有大多数时间用同步。而如果不需要对方的结果,且吞吐…

Zookeeper相关面试准备问题

Zookeeper介绍 Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生了变化,Zookeeper就负责通知已经在Zoo…

SpringAOP+SpringBoot事务管理

项目搭建SpringAOPSpringBoot中管理事务AOP案例实战-日志记录日志系统 一、项目搭建 第一步:构建项目 第二步:导入依赖 第三步:配置信息 自动配置(项目自动生成的启动类) /*** 启动类:申明当前类是一个…

模拟被观察物体的位置和方向

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题:模拟被观察物体的位置和方向,以帮助用户理解相机在观察特定对象时的位置和朝向。vtkCameraOrientationWidget 模拟的是被观察…

Redis核心技术与实战【学习笔记】 - 17.Redis 缓存异常:缓存雪崩、击穿、穿透

概述 Redis 的缓存异常问题,除了数据不一致问题外,还会面临其他三个问题,分别是缓存雪崩、缓存击穿、缓存穿透。这三个问题,一旦发生,会导致大量的请求积压到数据库。若并发量很大,就会导致数据库宕机或故…

九州金榜|如何做好家庭教育

孩子的家庭教育是每个家庭都要做的,也是每个家长面临的事情,同样不同的家庭教育教育出来的孩子性格也各不相同,有时候家长看别别人家的孩子品学兼优非常羡慕,很多家长会把问题归结到孩子身上,其实有没有想过是家庭教育…