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

news2024/12/26 20:49:00

文章目录

  • 单变量图的类型
    • 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 pd

hist_data = pd.read_excel(r"柱形图绘制数.xlsx")

#(a) Matplotlib绘制的直方图
import matplotlib.pyplot as plt

plt.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"] = False

hist_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"] = 15

hist_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 plt

hist_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 pd

hist_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 plt

bins=15
hist_x_data = hist_data02["hist_data"].values

Median = 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 rc

rc["axes.labelsize"] = 15
rc['tick.labelsize'] = 12
rc["suptitle.size"] = 15


bins=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 norm

bins=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()) / bins

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="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.coloradmin.cn/o/946483.html

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

相关文章

illegal cyclic inheritance involving trait Iterable_2种解决方式

一、报错内容 /Users/liyangda/Code/DemoProject/demo-scala/src/scala/old04/T4.scala:11:20 illegal cyclic inheritance involving trait Iterableval value List(1, 2, 3, 4, 5, 6, 7, 8)二、问题解决 1、方式一:降低scala版本 可以选择降低Scala的版本&…

《探花交友》之开篇

《探花交友》 功能介绍项目介绍工程搭建短信验证码实现用户登录功能前后端开发视频及相关资源领取Q作者 1、功能介绍 探花交友是一个陌生人的在线交友平台,在该平台中可以搜索附近的人,查看好友动态,平台还会通过大数据计算进行智能推荐&a…

若依自定义详情页(传多个参数)

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 不知道…

gerrit 如何提交进行review

前言 本文主要介绍如何使用gerrit进行review。 下述所有流程都是参考: https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html 先给一个commit后但是还没有push上去的一个办法: git reset --hard HEAD^可以多次reset.…

5V升压充电16.8V芯片充电管理IC

航誉微HU5912四节锂电池升压充电IC 概要 HU5912是一款 5V输入,支持四节锂电池的升压充电管理 IC。 HU5912 ,采用异步开关架构,使其在应用时仅需 要极少的外围器件,可有效减少整体方案尺寸,降低 BOM 成本。 HU5912…

腾讯云便宜购买指南(腾讯云怎样购买划算)

腾讯云是国内知名的云计算服务商,拥有广泛的应用和用户群体。对于有需要的用户来说,怎样便宜购买腾讯云产品是一个值得关注的问题,下面给大家分享腾讯云便宜购买指南。 腾讯云便宜购买指南:1、新用户专属礼包;2、老用户…

网路日志服务器

网络日志服务器是用于集中存储、管理和分析网络设备生成的日志数据的服务器。它扮演着收集、存储和分析网络日志的关键角色,对于网络安全、故障排除和性能优化等方面具有重要意义。 网络日志服务器的工作原理是通过与网络设备建立连接,接收并保存设备生成…

《人月神话》:chapter 4 系统设计中的“专制”和“民主”

以下总结来自于《人月神话》 第四章 :贵族制,民主制和系统设计 系统设计中最重要的因素:概念完整性 1.设计必须由一个人或者具有共识的小型团队来完成 2.大型系统架构设计与具体实现相分离 3.必须有人控制概念,确保完整性&…

WebSocket- 前端篇

官网代码 // 为了浏览器兼容websocketconst WebSocket window.WebSocket || window.MozWebSocket// 创建连接 this.socket new WebSocket(ws://xxx)// 连接成功this.socket.onopen (res)>{console.log(websocket 连接成功)this.socket.send(入参字段) // 传递的参数字段}…

【Android】AES解密抛出异常Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

Java使用AES加密的时候没得问题,但是在解密的时候就出错了,一起来找找原因吧。 首先,Java运行的代码如下,使用AES加解密 Cipher cipher Cipher.getInstance("AES/CBC/NOPadding"); //...主要问题 可调试运行控制台抛…

Figma怎么导出源文件,超详细教程来了

Figma怎么导出源文件,超详细教程来了要说近几年话题最多的界面设计软件,Figma当之无愧。用一句话去定义Figma,它是一款基于浏览器的全能型设计工具。Figma允许设计师、开发者和其他团队成员无论身在何处,都可以共同协作创建和编辑…

FastStone Capture

FastStone Capture 简介下载安装注册 简介 FastStone Capture是一款用于屏幕截图和屏幕录制的工具。它允许用户捕捉屏幕上的内容,并将其保存为图像文件,还可以录制屏幕活动为视频文件。 FastStone Capture官网: https://www.faststone.org/FSCaptureDet…

JDK源码解析-ArrayList

1. ArrayList类 1.1 ArrayList类结构图 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复。 (1)ArrayList 是一种变长的集合类,基于定长数组实现。 (2)ArrayList 允许空值…

[Android 四大组件] --- Activity

1 Activity是什么 ​​Activity​​是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。 一个应用通常是由多个彼此松散联系的Activity组成&…

NFTScan 正式上线 Base NFTScan 浏览器和 NFT API 数据服务

2023 年 8 月 24 号,NFTScan 团队正式对外发布了 Base NFTScan 基础设施,将为 Base 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,Base 是继 Bitcoin、Ethereum、BNBChain、…

合宙Air724UG LuatOS-Air LVGL API控件--日历 (Calendar)

日历 (Calendar) LVGL 提供了一个用来选择和显示当前日期的日历控件。 示例代码 – 高亮显示的日期 highlightDate lvgl.calendar_date_t() – 日历点击的回调函数 – 将点击日期设置高亮 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then da…

Web项目与帆软11集成后通过项目访问cpt文件会弹出数据决策系统登录界面如何取消

1、登录帆软 - 数据决策系统 * 点击 :管理系统 - 模板认证 - 点击设置按钮 - 关闭 2、选择关闭单个认证 你点击后,它默认所有都是开的。你依次点击关闭,然后再把要的模板点击开启,如下图所示:第一个就表示开了认证&am…

vxe-table中树形结构

如图,同事让帮忙实现一个需求 从二级树节点开始,同时选中的只能有一个二级树节点,选中的二级树节点之下的子节点都可以被选中。否则不能被选中 直接上代码 需要注意的是,文中树状图传递的数据是打平的数据,设置代码是…

[集创赛海云捷讯杯]全国二等奖经验分享

[集创赛海云捷讯杯]全国二等奖经验分享 一.前言二.我们的作品三.小结 一.前言 笔者是研一在校生,从五月份开始和本科生一起卷集创赛,经历初赛,分赛区决赛,全国总决赛,认识了很多一起做比赛的朋友收获颇丰。今年海云杯…

记录一次可视化大屏开发

版本:echarts5.3.0 - echarts-gl2.0.8 echarts大部分问题都是版本原因,4.x和5.x区别很大,推荐^5.3.0,因为有些api需要这个版本以上才支持。另外5.1支持svg地图数据格式,与之前的一些用法截然不同,同时拓展性…