‘’’
np.random.normal 生成高斯分布的概率密度随机数,一维数据
(loc,scale,size)
loc:float
此概率分布的均值(对应着整个分布的中心centre)
scale:float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值
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 :
整数值或序列。如果bins为整数值,则bins为柱子个数,根据数据的取值范围和柱子个数bins计
算每个柱子的范围值,柱宽=(x.max()-x.min())/bins。例:数据取值为[1,2,3,4,5,6],bins=6,
柱宽=0.8333…,则每个柱子的范围分别为:[1,1.83), [1.83,2.66)…,[5.17,6],见下图:
如果bins取值为序列,则该序列给出每个柱子的范围值(即边缘)。除最后一个柱子外,其他柱子的
取值范围均为半开(左闭右开)。接上例,数据共n=6个取值,若bins=range(1,n+2)即bins的取
值为[1,2,3,4,5,6,7],注意range用法。则每个柱子的范围为:[1,2),[2,3),…,[5,6),
[6,7]。注意:这里可以看出为什么bins的取值需要包含7,因为最后一个柱子的取值范围是全闭的,
如果取值只到6,则最后一个柱子的范围为[5,6],取值为5和6的数据将被合并计算。例子见下图:
可以理解为单个直方设置为多少个
range :
元组(tuple)或None。剔除较大和较小的离群值,给出全局范围。如果为None,则默认为
(x.min(), x.max())。如果bins取值为序列,则range无效,python会基于bins的取值画图。
density(已更新,不支持normed) :
布尔值。如果为true,则返回的元组的第一个参数frequency将为频率而非默认的频数。可自行验证
sum(frequency)。
是否将得到的直方图向量归一化
normed=True
表示正则化直方图,即归一化(即求频率)
normed=1
Y轴显示x值出现的概率
normed=0
Y轴显示X值出现的个数
weights :
与x形状相同的权重数组。将x中的每个元素乘以对应权重值再计数。如果normed或density取值为
True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图。
cumulative :
布尔值。如果为True,则计算累计频数。如果normed或density取值为True,则计算累计频率。
bottom :
数组,标量值或None。每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/
向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子。
histtype : {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}, optional
选择展示的类型,默认为bar
'bar’是传统的条形直方图;'barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,
只有外边框;‘stepfilled’是有填充的直方图。当histtype取值为’step’或’stepfilled’,
rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起。
align : {‘left’, ‘mid’, ‘right’}, optional
对齐方式
‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的
中心位于bins的右边缘。可在上面两张图中求证。
orientation : {‘horizontal’, ‘vertical’}, optional
直方图方向
如果取值为horizontal,则条形图将以y轴为基线,水平排列。
rwidth :float or None, default: None
标量值或None。柱子的宽度占bins宽的比例。例:当bins=range(1,8)时,每个柱子默认宽为1,
若设置rwidth=0.8,则柱子的宽度将为0.8,柱子之间的距离为0.2。
log : boolean, optional
log刻度
布尔值。如果取值为True,则坐标轴的刻度为对数刻度。如果log为True且x是一维数组,则计数为0
的取值将被剔除,仅返回非空的(frequency, bins, patches)。
color : color or array_like of colors or None, optional
颜色设置
label : string or None, optional
刻度标签
stacked : boolean, optional(?)
布尔值。如果取值为True,则输出的图为多个数据集堆叠累计的结果,见下图;如果取值为False且
histtype=‘bar’或’step’,则多个数据集的柱子并排排列,见下图。
返回的参数:
frequency(官方文档用n表示):数组或数组列表。柱子的高,即频数或频率值,数据类型为float。
bins:每个柱子的左右边缘值(即区间范围),例子见上文输入参数bins。
patches:列表或列表的列表。取值为每个柱子包含的数据。
‘’’
Copied from
url:
https://www.icourse163.org/learn/BIT-1001870002?tid=1461061450#/learn/content?type=detail&id=1237317469&cid=1257276131
@author 嵩天
‘’’
import numpy as np #导入numpy库
import matplotlib.pyplot as plt #导入matplotlib库的pyplot函数
np.random.seed(0) #通过numpy引用random的seed函数建立种子0
mu,sigma=100,20 #设定loc和scale值,对应np.random.normal参数
a=np.random.normal(mu,sigma,size=100)
#生成均值为100,标准差为20,scale理解为数值个数
plt.hist(a,20,destiny=1,histtype='step',facecolor='r',alpha=1)
#按照参数数组a,直方20个,数据归一化,展示方式为'step',颜色为红色,透明度为1,生成直方图
plt.show()
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()
扩展应用:
增加不同长条形色彩映射
利用hist函数的三个返回值,对每一个不同区间进行不同颜色的显示.通过这种方式可以直观的看出分布的差异.
n: 数组或数组列表,表明每一个bar区间的数量或者百分比;
bins : 数组,bar的范围和bins参数含义一样;
patches : 列表,每个bar图形对象;
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)
"""
n: 数组或数组列表,表明每一个bar区间的数量或者百分比
bins : 数组,bar的范围和bins参数含义一样
patches : 列表 或者列表的列表 图形对象
"""
n, bins, patches =plt.hist(data, bins=40,)
percent = n / n.max()
#将percent中的数据进行正则化,这样可以方便的映射到colormap中
'''
matplotlib.colors.Normalize(vmin=None, vmax=None, clip=False)
vmin, vmaxfloat or None
If vmin and/or vmax is not given, they are initialized from the minimum and maximum value, respectively, of the first input processed; i.e., __call__(A) calls autoscale_None(A).
clipbool, default: False
If True values falling outside the range [vmin, vmax], are mapped to 0 or 1, whichever is closer, and masked values are set to 1. If False masked values remain masked.
Clipping silently defeats the purpose of setting the over, under, and masked colors in a colormap, so it is likely to lead to surprises; therefore the default is clip=False.
'''
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()
显示多个数据的直方图
可以在一个图中显示多个数据的直方图,方便对不同数据进行对比.
重点区分坐标系一和坐标系四两者之间显示的区别
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].hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
axes[0][0].legend(prop={'size': 10})
axes[0][0].set_title('bar hist')
"""
第二坐标系,使用bar条来显示,设置的堆积的属性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()
双变量直方图
在进行一维频次直方图绘制之外,可以对二维数组按照二维区间进行二维频次的直方图绘制.
重点:此处使用另外一种方式进行多子图的绘制,利用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()