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

文章目录

  • 单变量图的类型
    • 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.mzph.cn/news/58778.shtml

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

相关文章

基于 CentOS 7 构建 LVS-DR 群集。配置nginx负载均衡。

1、基于 CentOS 7 构建 LVS-DR 群集。 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260-6232c8be18dc ethernet ens33 [root132 ~]# nmcli c m ens33 ipv4.addresses 192.168.231.200/24 [roo…

8 python的迭代器和生成器

概述 在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非常重要的概…

windows下如何搭建属于自己的git服务器

前一阵子公司需要,领导让我给我们技术部搭建一个git服务器。以前看过教程,但自己没动手做过,开始按照网上的教程来,但搭建过程中发现还是不够详细,今天给大家一个比较详细的,希望对大家有帮助。 高能预警&a…

微软用 18 万行 Rust 重写了 Windows 内核

微软正在使用 Rust 编程语言重写其核心 Windows 库。 5 月 11 日——Azure 首席技术官 Mark Russinovich 表示,最新的 Windows 11 Insider Preview 版本是第一个包含内存安全编程语言 Rust 的版本。 “如果你参加了 Win11 Insider 环,你将在 Windows 内…

ES6之浅尝辄止1:class的用法

class是es6新增的一种语法糖,用于简化js中构造类的过程 1.es5中如何构造类? function Person(name,age){this.name name;this.age age; } Person.prototype.sayName function(){return this.name; } let p1 new Person(小明,22);2.es6中的class方式…

DC/DC开关电源学习笔记(二)开关电源的分类

(二)开关电源的分类 1.DC/DC类开关电源2.AC/DC变换器3.电路结构分类4.功率开关管分类5.电路拓扑分类 开关电源可分为 AC/DC和DC/DC两大类。 作为二次电源的DC/DC变换器现已实现模块化, 且设计技术及生产工艺在国内外均已成熟和标准化&#xf…

【微信小程序篇】- 多环境(版本)配置

最近自己在尝试使用AIGC写一个小程序,页面、样式、包括交互函数AIGC都能够帮我完成(不过这里有一点问题AIGC的上下文关联性还是有限制,会经常出现对于需求理解跑偏情况,需要不断的重复强调,并纠正错误,才能得到你想要的…

Python的pymysql模块与MySQL数据库的互动:基础与实例

Python的pymysql模块与MySQL数据库的互动:基础与实例 一、连接数据库二、创建游标三、执行SQL命令四、关闭连接 在Python的世界里,操作MySQL数据库最常用的库就是pymysql。 pymysql是一个灵活且易于使用的库,它允许我们以Python的方式操作MyS…

Bean 生命周期

Bean 生命周期 一、Bean 实例化的基本流程 Spring容器在进行初始化时,会将xml配置的的信息封装成一个BeanDefifinition对象,所有的BeanDefifinition存储到一个名为beanDefifinitionMap的Map集合中去,Spring框架在对该Map进行遍历&#xff0…

Debian系统上通过NFS挂载远程服务器硬盘

步骤 1:配置远程服务器 在拥有硬盘内容的远程服务器上,进行以下配置: 安装NFS服务器软件: sudo apt-get update sudo apt-get install nfs-kernel-server编辑NFS服务器配置文件 /etc/exports,添加需要共享的目录及其权…

分部署存储Ceph

文章目录 Ceph一.deploy-ceph部署1.系统环境初始化1.1 修改主机名,DNS解析1.2 时间同步1.3 配置apt基础源与ceph源1.4关闭selinux与防火墙1.5 创建 ceph 集群部署用户cephadmin1.6分发密钥 2. ceph部署2.1 安装ceph 部署工具2.2 初始化 mon 节点2.3 安装ceph-mon服务…

Jmeter性能综合实战 —— 签到及批量签到

提取性能测试的三个方面:核心、高频、基础功能 签 到 请 求 步 骤 1、准备工作: 签到线程组n HTTP请求默认值n HTTP cookie 管理器n 首页访问请求n 登录请求n 查看结果树n 调试取样器l HTTP代理服务器 (1)创建线程组 &#xf…

〖程序员的自我修养 - 认知剖析篇⑩〗- 学习编程的高效率方法

人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏,购买任意白宝书体系化专栏可加入易编程社区,早鸟价订阅模式除外。福利:加入社区的小伙伴们,除了可以获取博主所有付费专栏的阅读…

python面试:使用cProfile剖析程序性能

我们需要安装tuna:pip install tuna 程序执行完毕后,我们会得到一个results.prof,在CMD中输入指令:“tuna results.prof”。 import time import cProfile import pstatsdef add(x, y):resulting_sum 0resulting_sum xresulti…

Fooocus:一个简单且功能强大的Stable Diffusion webUI

Stable Diffusion是一个强大的图像生成AI模型,但它通常需要大量调整和提示工程。Fooocus的目标是改变这种状况。 Fooocus的创始人Lvmin Zhang(也是 ControlNet论文的作者)将这个项目描述为对“Stable Diffusion”和“ Midjourney”设计的重新…

http服务(Apache 2.4.57)源码编译及使用

这里安装的是Apache 2.4.57版本 1.下载源码包及编译安装 下载地址 # 下载 wget https://archive.apache.org/dist/httpd/httpd-2.4.57.tar.gz # 如果系统自带httpd这个软件要删除掉,两个软件不能同时运行 rpm -e httpd --nodeps # 安装依赖环境 yum -y install apr apr-dev…

《PyTorch 2.0深度学习从零开始学》已出版

#好书推荐##好书奇遇季#《PyTorch 2.0深度学习从零开始学》,京东当当天猫都有发售。定价69元,网店打折销售更便宜。本书配套示例项目源码、PPT课件。 本书以通俗易懂的方式介绍PyTorch深度学习基础理论,并以项目实战的形式详细介绍PyTorch框…

【算法随记】C(n,m)不越界但A(n,m)越界;C(n,1)+C(n,3)+C(n,5)...等二项式定理;“memset”: 找不到标识符

https://codeforces.com/contest/893/problem/E C(n,m)不越界但A(n,m)越界的解决方案 C(n,m) A(n,m) / (n-m)! 这题要模1e97,但是只有加减乘能模,除法模不了。所以这个A(n,m)要存原值,原值也太大了,爆 long long 要是能不要除…

电脑入门:路由器 基本设置操作说明

路由器 基本设置操作说明 首先我们我设置路由器,就需要先登录路由器, 那么怎样登路由器啊? 登录路由器的方法是 在ie的地址栏输入:http://192.168.1.1 输入完成以后直接回车 那么如果你输入正确 这个时候就应该听到有用户名的提示 呵呵 这是怎么回事啊? 不要召集 首…

使用Python脚本添加新的相关节点到arxml文件中的指定位置

使用Python脚本添加新的相关节点到arxml文件中的指定位置 1 背景 随着汽车软件开发的复杂度越来越高,链路越来越长,很多手动配置的工具链所需要的时间就会被拉长,显然这对于项目的开发进度有了一定影响,根据需求自动化生成arxml文件其实很有必要。同时越来越多的测试开始…