分布(一)利用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 pltsns.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 pltsns.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 pltsns.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://xiahunao.cn/news/2779072.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

day37 闭包、变量提升

目录 闭包变量提升函数提升 闭包 闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScr…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用:网页的调色盘4.1.1 基础知识4.1.2 重点案例:创建一个具有情感设计的登录页面4.1.3 拓展案例 1:使用颜色增强信息的可视化表示4.1.4 拓展案例 2:利用颜色创建网站的品牌身份 4.2 字体与文…

MySQL篇----第二十篇

系列文章目录 文章目录 系列文章目录前言一、NULL 是什么意思二、主键、外键和索引的区别?三、你可以用什么来确保表格里的字段只接受特定范围里的值?四、说说对 SQL 语句优化有哪些方法?(选择几条)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

无人机遥感技术应用分析,无人机遥感系统测绘技术详解

由于无人机具有机动快速、使用成本低、维护操作简单等技术特点,因此被作为一种理想的飞行平台广泛应用于军事和民用各个领域。尤其是进入二十一世纪以后,许多国家将无人机系统的研究、开发、应用置于优先发展的地位,体积小、重量轻、探测精度高的新型传感器的不断问世,也使无人…

QT入门-基本控件

1.QTextEdit qt助手查看可知一些信息,其余信息见全文 1.1 functions public function如下: 使用时通过QT助手查找 实例: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new …

【自然语言处理】微调 Fine-Tuning 各种经典方法的概念汇总

【自然语言处理】微调 Fine-Tuning 各种经典方法的概念汇总 前言请看此微调 Fine-TuningSFT 监督微调(Supervised Fine-Tuning)概念:监督学习,无监督学习,自监督学习,半监督学习,强化学习的区别…

构建高效Docker环境:网络配置全指南

构建高效Docker环境:网络配置全指南 引言Docker网络基础Docker网络概述Docker网络类型Docker网络的重要性 Docker网络配置Bridge网络配置与实践Host和None网络配置的特点与应用Overlay网络的配置及其在集群中的使用 Docker网络命令详解常用网络命令实例讲解 容器间通…

【开源】SpringBoot框架开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

【学网攻】 第(25)节 -- 帧中继(多对一)

系列文章目录 目录 系列文章目录 文章目录 前言 一、帧中继是什么? 二、实验 1.引入 实验目标理解帧中继在广域网中的原理及功能; 实验背景 技术原理 实验步骤 实验设备 实验拓扑图​编辑 实验配置 实验验证 文章目录 【学网攻】 第(1)节…

vue3 的setup和生命周期

vue3 的setup和生命周期 许多文章认为setup执行时间在beforeCreate 和created 之间,但是通过实际测试发现setup调用在beforecreate之前。 export default {beforeCreate() {console.log(beforeCreate running....);},created() {console.log("created runnin…

什么是ROAS以及它如何衡量广告活动的有效性

有没有想过您的广告活动效果如何?想想 ROAS,即广告支出回报率。ROAS衡量的是每花一美元广告所产生的收入。虽然 ROAS 是一个强大的指标,可以为我们提供丰富的见解,但不应孤立地考虑它。本文将带你了解什么是 ROAS 以及它如何衡量广…

Python Django路由详解

1.路由Router 在实际开发过程中,一个Django 项目会包含很多的 app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所…

C# OpenVino Yolov8 Pose

目录 效果 模型信息 项目 代码 下载 效果 模型信息 Model Properties ------------------------- date:2023-09-07T17:11:43.091306 description:Ultralytics YOLOv8n-pose model trained on /usr/src/app/ultralytics/datasets/coco-pose.yaml a…

【Make编译控制 06】CMake初步使用

目录 一、概述与安装 二、编译源文件 三、无关文件管理 一、概述与安装 CMake是一个跨平台的项目构建工具,相比于Makefile,CMake更加高级,因为CMake代码在执行的时候是会先翻译生成Makefile文件,再调用Makefile文件完成项目构…

Camunda如何发送邮件及委托代码讲解

💖专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧😘 💖什么是委托…

力扣 第 383 场周赛 解题报告 | KMP

力扣 第 383 场周赛 解题报告 | KMP 链接 前言 一个人能走的多远不在于他在顺境时能走的多快,而在于他在逆境时多久能找到曾经的自己。 T1 修改矩阵 思路:模拟 时间复杂度: O ( m n ) O(mn) O(mn) class Solution:def modifiedMatrix(se…

二、Mybatis相关概念

1.对象/关系数据库映射(ORM) ORM全称Object/Relation Mapping:表示对象-关系映射的缩写ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,程序员既可以利用面向对象程序设计语言的简单易用性,又可以利用关系数…

leetcode:131.分割回文串

树形结构: 切割到字符串的尾部,就是叶子节点。 回溯算法三部曲: 1.递归的参数和返回值: 参数字符串s和startIndex切割线 2.确定终止条件: 当分割线到字符串末尾时到叶子节点,一种方案出现 3.单层搜索…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

036 冒泡排序

代码实践 // 冒泡排序 static void bubbleSort(Comparable[] elements) {// 临时容器&#xff0c;用于变量交换值时存储Object temp;// 标志位 用于减少无意义的循环次数boolean flag;for (int i 0; i < elements.length - 1; i) {flag false;for (int j 0; j < elem…