IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> matplotlib之直方图 -> 正文阅读

[人工智能]matplotlib之直方图

在这里插入图片描述

文本以及后续的系列文章中均会使用到numpy这个库,numpy是Python的一种开源的数值计算扩展,主要用来生产一些随机数作为绘图的原始数据。具体和安装matplotlib类似,可以参考安装Matplotlib这篇文章。


直方图

直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量,以长条图(bar)的形式具体表现。因为直方图的长度及宽度很适合用来表现数量上的变化,所以较容易解读差异小的数值


一、hist函数说明

1、函数定义:

在向量 x 和 y 指定的位置创建一个包含圆形的散点图,该类型的图形也称为气泡图。

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, \*, data=None, \*\*kwargs)

常用参数:

  • x:
    数据集,最终的直方图将对数据集进行统计
  • bins:
    统计的区间分布划分,指定bin(箱子)的个数;
  • range:
    显示的区间,range在没有给出bins时生效
  • density:
    显示概率密度,默认为false
  • histtype:
    可选{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}之一,默认为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar类似
  • align:
    可选{‘left’, ‘mid’, ‘right’}之一,默认为’mid’,控制柱状图的水平分布,left或者right,会有部分空白区域,推荐使用默认
  • log:
    默认为False,y坐标轴是否选择指数刻度,在数据分布的范围较大的时候,可以通过log指数刻度来缩小显示的范围。
  • stacked:
    默认为False,是否为堆积状图

2、hist的详细定义:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html?highlight=hist#matplotlib.pyplot.hist

二、示例说明:

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

"""
font:设置中文
unicode_minus:显示负号
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号

"""
随机数生成,自动生成正态分布的数据集
"""
data = np.random.randn(10000)

"""
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=40, density=False, facecolor="tab:blue", edgecolor="tab:orange", alpha=0.7)

"""
xlabel:横轴标签
ylabel:纵轴标签
title:图标题
"""
plt.xlabel("区间")
plt.ylabel("频数(频数)")
plt.title("频数(频率)分布图")
plt.show()

运行结果:
在这里插入图片描述

三、扩展应用

1、增加不同长条形的色彩映射

利用hist函数的三个返回值,对每一个不同区间进行不同颜色的显示.通过这种方式可以直观的看出分布的差异. n: 数组或数组列表,表明每一个bar区间的数量或者百分比; bins : 数组,bar的范围和bins参数含义一样; patches : 列表,每个bar图形对象;

import matplotlib.pyplot as plt
import numpy as np
import matplotlib
from matplotlib import colors
"""
font:设置中文
unicode_minus:显示负好
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号

"""
随机数生成,自动生成正态分布的数据集
"""
data = np.random.randn(10000)

"""
n: 数组或数组列表,表明每一个bar区间的数量或者百分比
bins : 数组,bar的范围和bins参数含义一样
patches : 列表 或者列表的列表 图形对象
"""
n, bins, patches =plt.hist(data, bins=40,)
percent = n / n.max()
#将percent中的数据进行正则化,这样可以方便的映射到colormap中

norm = colors.Normalize(percent.min(), percent.max())
"""
patches为对应每个长条的对象,循环为每个bar条进行颜色的设置.
set_facecolor()用来设置条形的颜色
"""

for thisfrac, thispatch in zip(percent, patches):
    color = plt.cm.viridis(norm(thisfrac))
    thispatch.set_facecolor(color)
"""
xlabel:横轴标签
ylabel:纵轴标签
title:图标题
"""
plt.xlabel("区间")
plt.ylabel("频数(频数)")
plt.title("频数(频率)分布图")
plt.show()

运行结果:
在这里插入图片描述

2、显示多个数据的直方图

可以在一个图中显示多个数据的直方图,方便对不同数据进行对比.
重点区分坐标系一和坐标系四两者之间显示的区别

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(64)
n_bins = 20
"""
生成为一个纬度为(6000,3)的随机数据
"""
x = np.random.randn(6000, 3)

"""
生成有两行两列坐标系的画布
"""
fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(16,9))
"""
第一坐标系,使用bar条来显示

为了和第四坐标系进行效果对比,次数对三列随机数进行分别显示
"""
colors = ['tab:blue', 'tab:orange', 'tab:green']
alpha=[1,0.6,0.3]
for index in np.arange(x.shape[1]):
    axes[0][0].hist(x[:,index], n_bins, density=True, histtype='bar', color=colors[index], label=colors[index],alpha=alpha[index])    

axes[0][0].legend(prop={'size': 10})
axes[0][0].set_title('bar hist')
"""
第二坐标系,使用bar条来显示,设置的堆积的属性stacked
"""
#stacked=True,设置的堆积的属性stacked
axes[0][1].hist(x, n_bins, density=True, histtype='bar', stacked=True)
axes[0][1].set_title('stacked bar hist')
"""
第三坐标系,使用step来显示,设置的堆积的属性stacked
"""
axes[1][0].hist(x, n_bins, histtype='step', stacked=True, fill=False)
axes[1][0].set_title('stacked step hist')
"""
第四坐标系,一次性显示三列数据
"""
axes[1][1].hist(x, n_bins, density=True,histtype='bar')
axes[1][1].set_title('bat hist')

fig.tight_layout()
plt.show()

运行结果:
在这里插入图片描述

3、双变量直方图

在进行一维频次直方图绘制之外,可以对二维数组按照二维区间进行二维频次的直方图绘制.

重点:此处使用另外一种方式进行多子图的绘制,利用GridSpec可以更加灵活的多子图的绘制

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors
from matplotlib.ticker import PercentFormatter

import matplotlib.gridspec as gridspec

np.random.seed(64)
N_points = 800
n_bins = 40

"""
生成为x,y随机数据
"""
x = np.random.randn(N_points)
y = 2* x + np.random.randn(N_points) + 5

fig = plt.figure(figsize=(10, 8))
# gridspec的用法,可以使图像横跨多个坐标
G = gridspec.GridSpec(2, 2)

#显示第一坐标系,其位置第一行,第一列(G[0, 0])
axes =fig.add_subplot(G[0, 0])
axes.hist(x, bins=n_bins)

#显示第二坐标系,其位置第一行,第二列(G[0, 1])
axes =fig.add_subplot(G[0, 1])
axes.hist(y, bins=n_bins)

#显示第三坐标系,其位置第二行整行(G[1, :])
axes =fig.add_subplot(G[1, :])
axes.hist2d(x,y, bins=n_bins)

plt.show()

运行结果:
在这里插入图片描述

4、添加分布曲线

分布曲线是以变数值为横坐标,以累积频率为纵坐标的曲线图,即概率分布函数的图形。生产与科学实验中很多随机变数的机率分布都可以近似地用常态分配来描述。比如,在工厂生产条件不变的情况下,产品的强力、抗压强度、口径、长度等指标;同一种生物体的身长、体重等指标,等等。一般来说,如果一个便利量是由许多微小的独立随机因素影响的结果,那么就可以认为这个量具有常态分配。

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

N=40
"""
font:设置中文
unicode_minus:显示负好
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号

"""
随机数生成,自动生成正态分布的数据集
"""
data = np.random.randn(10000)

fig,ax = plt.subplots()

n, bins, patches = ax.hist(data, bins=N, density=True)
# 添加分布曲线
ax.plot(bins[:N],n,'--')
"""
xlabel:横轴标签
ylabel:纵轴标签
title:图标题
"""
plt.xlabel("区间")
plt.ylabel("频数(频数)")
plt.title("频数(频率)分布图")
plt.show()

运行结果:
在这里插入图片描述

5 不等距分布

以上的代码示例均为等距分布的条形构成,而在实际的应用中,往往需要展示多个不等距数据段的分布情况。

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


"""
font:设置中文
unicode_minus:显示负好
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号

"""
随机数生成,自动生成正态分布的数据集
"""
data = np.random.randn(10000)

fig,ax = plt.subplots()

Bins = [-3,-1,0.5,1,1.5,2,4]
n, bins, patches = ax.hist(data, bins=Bins, density=True)
# 添加分布曲线
ax.plot(Bins[:-1],n,'--')
"""
xlabel:横轴标签
ylabel:纵轴标签
title:图标题
"""
plt.xlabel("区间")
plt.ylabel("频数(频数)")
plt.title("频数(频率)分布图")
plt.show()

运行结果:
在这里插入图片描述


总结

直方图可使我们比较容易直接看到数据的分布形状、离散程度和位置状况:

  • 观察数据分布的类型,分析是否服从正态分布,有无异常;
  • 判断数据分布范围是否满足规格范围的要求;
  • 与产品规格界限做比较,判断分布中心是否偏离规格中心,以确定是否需要调整及调整量;
    常常利用直方图整理数据用以分析其分布状态,但有时根据观测数据所绘制的直方图呈非正态的异常分布。这说明过程已出现了异常。在这种状态下,是不能计算过程能力指数的,必须先排查异常原因,予以排查纠正后,再重新收集数据并分析。
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:19:11  更:2022-05-05 11:21:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:42:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码