这个链接很有用,需要的朋友可以去看看 添加链接描述
‘’’ 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()20201007更新 参考链接
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()matplotlib.colors.Normalize
