单变量图的类型与直方图绘图基础

文章目录

  • 单变量图的类型
    • 1.直方图(histogram plot)
    • 2.密度图(density plot)
    • 3.Q-Q 图(Quantile- Quantile plot,又称分位图)
    • 4.P-P 图(Probability-Probability plot)
    • 5.经验分布函数图(Empirical Distribution Function,EDF)
  • 直方图

单变量图(chart for one variable)是指使用数据组的一个变量进行相应图的绘制。想要可视化这个变量,就需要根据不同的数据变量类型绘制图。数据变量分为连续变量(continuous variable)和离散型变量(discrete variable)。

单变量图的类型

1.直方图(histogram plot)

直方图是一种用于表示数据分布和离散情况的统计图形,它的外观和柱形图相近,但表达的含义和柱形图却相差较大。

首先需要对数据组进行分组,然后统计每个分组内数据元的个数,最后使用一系列宽度相等、高度不等的长方形来表示相应的每个分组内的数据元个数。基于“统计数据频数”的绘图思想在一些带颜色映射的图绘制中较为常用。

2.密度图(density plot)

密度图(又称为密度曲线图)作为直方图的一个变种类型,使用曲线(多数情况下为平滑样式,但也会因核函数的不同而出现直角样式)来体现数值水平,其主要功能是体现数据在连续时间段内的分布状况。

和直方图相比,密度图不会因分组个数而导致数据显示不全,从而能够帮助用户有效判断数据的整体趋势。当然,选择不同的核函数,绘制的核密度估计图不尽相同。在一些科研论文绘图过程中,密度图的纵轴可以是频数(count)或密度(density)。

3.Q-Q 图(Quantile- Quantile plot,又称分位图)

Q-Q 图的本质是概率图,其作用是检验数据分布是否服从某一个分布。Q-Q 图检验数据分布的关键是通过绘制分位数来进行概率分布比较。首先选好区间长度,Q-Q 图上的点 (x, y) 对应第一个分布(X 轴)的分位数和第二个分布(Y 轴)相同的分位数。因此可以绘制一条以区间个数为参数的曲线。如果两个分布相似,则该 Q-Q 图趋近于落在 y = x 线上。如果两个分布线性相关,则点在 Q-Q 图上趋近于落在一条直线上。

例如,对于正太分布的 Q-Q 图,就是以标准正太分布的分位数作为横坐标,样本数据值为纵坐标的散点图。而想要使用 Q-Q 图对某一样本数据进行正态分布的鉴别时,只需观察 Q-Q 图上的点是否近似在一条直线附近,且该条直线的斜率为标准差,截距为均值

Q-Q 图不但可以检验样本数据是否符合某种数据分布,而且可以通过对数据分布形状的比较,来发现数据在位置、标度和偏度方面的属性。

在一般的学术研究中,使用直方图或密度图观察数据分布的频次要远高于 Q-Q 图。

4.P-P 图(Probability-Probability plot)

P-P 图是根据变量的累积概率与指定的理论分布累积概率的关系绘制的图形,用于直观地检验样本数据是否符合某一概率分布。当检验样本数据符合预期分布时,P-P 图中的各点将会呈现一条直线。P-P 图与 Q-Q 图都用来检验样本数据是否符合某种分布,只是检验方法不同而已。

5.经验分布函数图(Empirical Distribution Function,EDF)

在统计学中,经验分布函数也被称为经验累积分布函数。经验分布函数是一个与样本的检验测度相关的分布函数。对于被测变量的某个值,该值的分布函数值表示所有检验样本中小于或等于该值的样本的比例。经验分布函数图用来检验样本数据是否符合某种预期分布

直方图

在 Matplotlib 中,我们可使用 axes.Axes.Hist () 函数绘制直方图。

axes.Axes.Hist () 函数中,参数 x 为要绘制的样本数据;参数 bins 用于定义分布区间,该参数的值可设置成整数、给定数值序列或字符串,默认为数值类型且值为 10。当参数 bins 的值为整数时,定义范围内等宽 bin 的数量。当参数 bins 的值为自定义数值序列时,定义 bin 边缘数值,包括第一个 bin 的左边缘和最后一个 bin 的右边缘。

注意,在上述这种情况下,bin 的间距可能不相等。

当参数 bins 的值为字符串类型时,可选“auto”“fd”“rice”和“sqrt”等值。axes.Axes.Hist () 函数的参数 density 对应的值为布尔类型,该参数决定绘图结果是否为密度图,默认值为 False。

下面为分别使用 Matplotlib、ProPlot 和 SciencePlots 绘制的直方图示例:

(a)和(c)都是基于 Matplotlib 绘制的可视化结果,且(c)是使用 SciencePlots 包中的绘图主题进行绘制。下面给出(a)的核心绘制代码。

import numpy as np
import pandas as pdhist_data = pd.read_excel(r"柱形图绘制数.xlsx")#(a) Matplotlib绘制的直方图
import matplotlib.pyplot as pltplt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["axes.linewidth"] = 1
plt.rcParams["axes.labelsize"] = 15
plt.rcParams["xtick.minor.visible"] = True
plt.rcParams["ytick.minor.visible"] = True
plt.rcParams["xtick.direction"] = "in"
plt.rcParams["ytick.direction"] = "in"
plt.rcParams["xtick.labelsize"] = 12
plt.rcParams["ytick.labelsize"] = 12
plt.rcParams["xtick.top"] = False
plt.rcParams["ytick.right"] = Falsehist_x_data = hist_data["hist_data"].values
bins = np.arange(0.0,1.5,0.1)fig,ax = plt.subplots(figsize=(4,3.5),dpi=100,facecolor="w")
hist = ax.hist(x=hist_x_data, bins=bins,color="#3F3F3F",edgecolor ='black',rwidth = 0.8)ax.tick_params(axis="x",which="minor",top=False,bottom=False)
ax.set_xticks(np.arange(0,1.4,0.1))
ax.set_yticks(np.arange(0.,2500,400))
ax.set_xlim(-.05,1.3)
ax.set_ylim(0.0,2500)ax.set_xlabel('Values', )
ax.set_ylabel('Frequency')plt.show()

(b)的核心绘制代码如下:

#(b)ProPlot绘制的直方图import proplot as pplt
from proplot import rc
rc["axes.labelsize"] = 15
rc['tick.labelsize'] = 12
rc["suptitle.size"] = 15hist_x_data = hist_data["hist_data"].values
bins = np.arange(0.0,1.5,0.1)fig = pplt.figure(figsize=(3.5,3))
ax = fig.subplot()
ax.format(abc='a.', abcloc='ur',abcsize=16,xlabel='Values', ylabel='Frequency',xlim = (-.05,1.3),ylim=(0,2500))
hist = ax.hist(x=hist_x_data, bins=bins,color="#3F3F3F",edgecolor ='black',rwidth = 0.8)plt.show()

(c)使用了 SciencePlots 中优秀的绘图主题,用户只需要在绘制脚本前添加如下代码。

with plt.style.context(['science']):

核心代码如下:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plthist_x_data = hist_data["hist_data"].values
bins = np.arange(0.0,1.5,0.1)with plt.style.context(['science']):fig,ax = plt.subplots(figsize=(4,3.5),dpi=100,facecolor="w")hist = ax.hist(x=hist_x_data, bins=bins,color="#3F3F3F",edgecolor ='black',rwidth = 0.8)ax.set_xlim(-.05,1.4)ax.set_ylim(0.0,2500)ax.set_xlabel('Values', )ax.set_ylabel('Frequency')plt.show()

有时,为了显示一些必要的统计信息,我们需要在直方图中添加正态分布曲线(normal distribution curve)、均值线(mean line)和中位数线(median line)等,或者以短竖线样式在 X 轴位置处表示数据点。

Matplotlib 绘制的添加了正态分布曲线和中位数线的直方图示例如下:

带统计信息的直方图的绘制难点在于正态分布曲线的计算和绘制。我们可以使用 scipy.Stats.Norm () 函数对绘制数据实现正态拟合,计算出概率密度函数(Probability Density Function,PDF)结果。

由于概率密度函数结果是归一化的,即曲线下方的面积为 1,而直方图的总面积是样本数和每个 bin 宽度的乘积,因此,对概率密度函数结果与样本个数、bin 宽度值相乘的结果进行绘制,即可将绘制的曲线缩放到直方图的高度。

上图绘制代码如下:

import numpy as np
import pandas as pdhist_data = pd.read_csv(r"直方图绘制02.xlsx")hist_x_data = hist_data02["hist_data"].values
X_mean = np.mean(hist_x_data)# 图3-2-2 带统计信息的直方图绘制示例
from scipy.stats import norm
import matplotlib.pyplot as pltbins=15
hist_x_data = hist_data02["hist_data"].valuesMedian = np.median(hist_x_data)mu, std = norm.fit(hist_x_data)fig,ax = plt.subplots(figsize=(5,3.5),dpi=100,facecolor="w")
hist = ax.hist(x=hist_x_data, bins=bins,color="gray",edgecolor ='black',lw=.5)
# Plot the PDF.
xmin, xmax = min(hist_x_data),max(hist_x_data)
x = np.linspace(xmin, xmax, 100) # 100为随机选择,值越大,绘制曲线越密集
p = norm.pdf(x, mu, std)
N = len(hist_x_data)
bin_width = (x.max() - x.min()) / bins
ax.plot(x, p*N*bin_width,linewidth=1,color="r",label="Normal Distribution Curve")# 添加平均值线
ax.axvline(x=Median,ls="--",lw=1.2,color="b",label="Median Line")
ax.set_xlabel('Values')
ax.set_ylabel('Count')
ax.legend(frameon=False)plt.show()

下面是使用 ProPlot 和 SciencePlots 绘制的带统计信息的直方图示例。

(a)中的a. 为图形序号,可根据实际情况添加。除使用上述方式绘制直方图以外,我们还可以使用 Seaborn 中的 histplot () 函数绘制,该函数在使用上更加灵活。

# (a)使用ProPlot绘制的带统计信息的直方图示例
from scipy.stats import norm
from proplot import rcrc["axes.labelsize"] = 15
rc['tick.labelsize'] = 12
rc["suptitle.size"] = 15bins=15
hist_x_data = hist_data["hist_data"].values
Median = np.median(hist_x_data)
mu, std = norm.fit(hist_x_data)fig = pplt.figure(figsize=(3.5,3))
ax = fig.subplot()
ax.format(abc='a.', abcloc='ur',abcsize=16,xlabel='Values', ylabel='Count')hist = ax.hist(x=hist_x_data, bins=bins,color="gray",edgecolor ='black',lw=.5)
# Plot the PDF.
xmin, xmax = min(hist_x_data),max(hist_x_data)
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
N = len(hist_x_data)
bin_width = (x.max() - x.min()) / bins
ax.plot(x, p*N*bin_width,linewidth=1,color="r",label="Normal Distribution Curve")
# 添加平均值线
ax.axvline(x=Median,ls="--",lw=1.2,color="b",label="Median Line")
ax.legend(ncols=1,frameon=False,loc="ur")
plt.show()
# (b)使用SciencePlots 绘制的带统计信息的直方图示例from scipy.stats import normbins=15
hist_x_data = hist_data["hist_data"].values
Median = np.median(hist_x_data)
mu, std = norm.fit(hist_x_data)
xmin, xmax = min(hist_x_data),max(hist_x_data)
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std)
N = len(hist_x_data)
bin_width = (x.max() - x.min()) / binswith plt.style.context(['science']):fig,ax = plt.subplots(figsize=(4,3.5),dpi=100,facecolor="w")hist = ax.hist(x=hist_x_data, bins=bins,color="gray",edgecolor ='black',lw=.5)ax.plot(x, p*N*bin_width,linewidth=1,color="r",label="Normal Distribution Curve")# 添加平均值线ax.axvline(x=Median,ls="--",lw=1.2,color="b",label="Median Line")ax.set_xlabel('Values')ax.set_ylabel('Count')ax.legend(frameon=False)plt.show()

参考书籍:宁海涛.科研论文配图绘制指南——基于Python[M].北京:人民邮电出版社,2023:47-49.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【力扣】216. 组合总和 III <回溯、回溯剪枝>

【力扣】216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字 1 到 9,每个数字最多使用一次,返回所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回…

2024王道408数据结构P144 T17

2024王道408数据结构P144 T17 思考过程 先看题目,让我们判断两棵二叉树是否相似,相似指的是以下三个方面: T1和T2都是空的二叉树或T1和T2都只有一个结点T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的。 题…

大数据项目实战(Hadoop集群搭建)

一,搭建大数据集群环境 1.2 Hadoop集群搭建 1.2.1 jdk安装 1.下载jdk (1)在根目录下创建三个子目录以备后用。具体如下: mkdir -p /export/data mkdir -p /export/software mkdir -p /export/servers (2)下载路径: 1、官网下载地址http…

APP UI自动化测试思路总结

首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌握的,毕竟谁也不会跟钱过不去。接下来,一…

聊聊工科必备软件MATLAB

1.MATLAB的由来 MATLAB(Matrix Laboratory)最初是由美国的MathWorks公司于1980年代初开发的一种数值计算和科学数据可视化的编程环境。 MATLAB的起源可以追溯到20世纪70年代,在斯坦福大学,科学家Cleve Moler在长期从事数值计算的研…

Java流式编程详细介绍

文章目录 1. 流式编程介绍2. 过滤2.1 filter2.2 distinct2.3 limit2.4 sorted2.5 skip 3. 映射3.1 map3.2 flatmap 4 查找4.1 allMatch4.2 anyMatch4.3 noneMatch4.4 findFirst4.5 findAny 5. 归约6. 收集6.1 counting6.2 maxBy,minBy6.3 summingInt、summingLong、summingDoub…

1+X智慧安防系统实施与运维技能等级证产教融合基地建设方案

一、系统概述 1X智慧安防系统实施与运维技能等级证产教融合体系统融合了产业需求、教育培训和技能认证,通过课程培训、实训基地和实习实训等方式培养学员的技能水平,并通过技能认证来评估其能力,以满足智慧安防行业对人才的需求,并…

iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux)

GPIO口的操作,是很常见的功能。传统的GPIO sysfs接口已被弃用。自Linux 4.8起,内核提供了全新的操作gpio的方式libgpiod(C library and tools for interacting with the linux GPIO character device),当然也更高效&am…

Nuxt 菜鸟入门学习笔记三:视图

文章目录 入口文件组件 Components页面 Pages布局 Layouts Nuxt 官网地址: https://nuxt.com/ Nuxt 提供多个组件层来实现应用程序的用户界面。 入口文件 App.vue组件 Components页面 Pages布局 Layouts 下面逐一进行介绍。 入口文件 默认情况下,Nu…

vue3使用Elementplus 动态显示菜单icon不生效

1.问题描述 菜单icon由后端提供&#xff0c;直接用的字符串返回&#xff0c;前端使用遍历显示&#xff0c;发现icon不会显示 {id: 8, path:/userManagement, authName: "用户管理", icon: User, rights:[view]}, <el-menu-item :index"menu.path" v-f…

常用数据库备份方法,sql数据库备份方法

在信息时代&#xff0c;数据成为了公司的主要资产。然而&#xff0c;数据的安全性和完整性也成为企业管理的重要组成部分。因此&#xff0c;数据库备份至关重要。本文将详细介绍几种常见的数据库备份方法。 全备份 全备份是指数据库中所有数据的备份&#xff0c;包括数据文件、…

五、多表查询-4.6练习

一、准备数据 【效果展示】 emp1表&#xff08;员工表&#xff09;&#xff1a; dept1表&#xff08;部门表&#xff09;&#xff1a; salgrade表&#xff08;薪资等级表&#xff09;&#xff1a; 二、案例 1、查询员工的姓名、年龄、职位、部门信息&#xff08;隐式内连接&am…

SpringBoot + layui 框架实现一周免登陆功能

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

MySQL的日志undolog、binlog、redolog

1. 日志层次 binlog是Server层&#xff0c;undolog和redolog是innodb引擎层特有的。 2. 记录了什么 & 作用 binlog 记录了所有数据库结构变更和表数据修改的SQL日志。 主要用于数据备份和主从复制&#xff0c;比如误删数据了可以用binlog找回。 undolog 如下图&#…

Verilog 实现状态机自动售卖机

Verilog 实现状态机自动售卖机 教学视频&#xff1a;https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 功能需求 使用1元、2元、5元面值的纸币进行支付&#xff0c;获取6元的物品&#xff0c;不设…

在el-tree懒加载中进行局部刷新

在进行懒加载的树组件中&#xff0c;操作子节点新增、修改以及删除操作时&#xff0c;需要对树组件进行局部刷新&#xff1a; /* 懒加载 */ async loadNode(node, resolve) {if (node.level 0) {// 异步加载根节点数据const data await fn({ parentId: });resolve(data);thi…

linux中学习控制进程的要点

1. 进程创建 1.1 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核会做以下操作 分配新的内存块和…

19.CSS雨云动画特效

效果 源码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Cloud & Rain Animation</title><link rel="stylesheet" href="style.css"> </head> <bo…

专题:平面、空间直线参数方程下的切线斜率问题

本文研究平面、空间直线在参数方程形式下&#xff0c;切线斜率&#xff08;即导数&#xff09;如何表示的问题。 如上图所示。 设 y f ( x ) &#xff0c; x φ ( t ) &#xff0c; y ψ ( t ) 当 t t 0 时&#xff0c; x x 0 &#xff0c; y y 0 &#xff0c;即点 A 坐…

最简单vue获取当前地区天气--高德开放平台实现

目录 前言 一、注册成为高德平台开发者 二、注册天气key 1.点击首页右上角打开控制台 2.创建新应用 三、vue项目使用 1.打开vue项目找到public下的index.html&#xff0c;如果是vue3的话直接在主目录打开index.html文件就行&#xff0c;主要就是打开出口文件 ​编辑 2.根据高德…