上一主题

numpy.histogram

下一主题

numpy.histogramdd

numpy.histogram2d

numpy.histogram2d(x, y, bins=10, range=None, normed=False, weights=None)[source]

计算两个数据样本的二维直方图。

参数:

x:array_like,shape(N,)

包含要被直方图化的点的x坐标的数组。

y:array_like,shape(N,)

包含要被直方图化的点的y坐标的数组。

bins:int或array_like或[int,int]或[数组,数组],可选

bin规范:

  • 如果int,两个维度的仓的数量(nx = ny = bin)。
  • 如果array_like,二维的二进制边(x_edges = y_edges = bins)。
  • 如果[int,int],每个维度中的块数(nx,ny = bin)。
  • 如果[数组,数组],每个维度中的bin边(x_edges,y_edges = bins)。
  • 组合[int,数组]或[数组,int],其中int是二进制数的数字,数组是二进制边。

范围:array_like,shape(2,2),可选

沿着每个维度的仓的最左边缘和最右边缘(如果未在bin参数中明确指定):[[xmin, xmax] / t3> [ymin, ymax]]超出此范围的所有值将被视为离群值,而不在直方图中计算。

normed:bool,可选

如果为False,则返回每个bin中的样本数。如果为True,则返回bin密度bin_count / sample_count / bin_area

权限:array_like,shape(N,),可选

对每个样本(x_i, y_i)加权的数组w_i如果normed为True,则权重被归一化为1。如果normed为False,则返回的直方图的值等于属于落入每个仓中的样本的权重的和。

返回:

H:ndarray,shape(nx,ny)

样本的二维直方图xyx中的值沿第一个维度进行直方图,y中的值沿第二个维度进行直方图。

xedges:ndarray,shape(nx,)

仓沿第一维的边。

yedges:ndarray,shape(ny)

bin沿着第二维度。

也可以看看

histogram
1D直方图
histogramdd
多维直方图

笔记

When normed is True, then the returned histogram is the sample density, defined such that the sum over bins of the product bin_value * bin_area is 1.

请注意,直方图不遵循笛卡尔约定,其中x值在横坐标上,而y值在纵坐标轴上。相反,x沿数组(垂直)的第一维直方图,沿数组(水平)的第二维直方图y这可确保与histogramdd的兼容性。

例子

>>> import matplotlib as mpl
>>> import matplotlib.pyplot as plt

构造具有可变bin宽度的2D直方图。首先定义bin边缘:

>>> xedges = [0, 1, 1.5, 3, 5]
>>> yedges = [0, 2, 3, 4, 6]

接下来我们创建一个带有随机bin内容的直方图H:

>>> x = np.random.normal(3, 1, 100)
>>> y = np.random.normal(1, 1, 100)
>>> H, xedges, yedges = np.histogram2d(y, x, bins=(xedges, yedges))

或者,我们用确定的bin内容填充直方图H:

>>> H = np.ones((4, 4)).cumsum().reshape(4, 4)
>>> print(H[::-1])  # This shows the bin content in the order as plotted
[[ 13.  14.  15.  16.]
 [  9.  10.  11.  12.]
 [  5.   6.   7.   8.]
 [  1.   2.   3.   4.]]

Imshow只能做一个等距表示的箱:

>>> fig = plt.figure(figsize=(7, 3))
>>> ax = fig.add_subplot(131)
>>> ax.set_title('imshow: equidistant')
>>> im = plt.imshow(H, interpolation='nearest', origin='low',
                extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])

pcolormesh可以显示确切的边框:

>>> ax = fig.add_subplot(132)
>>> ax.set_title('pcolormesh: exact bin edges')
>>> X, Y = np.meshgrid(xedges, yedges)
>>> ax.pcolormesh(X, Y, H)
>>> ax.set_aspect('equal')

NonUniformImage通过插值显示精确边框:

>>> ax = fig.add_subplot(133)
>>> ax.set_title('NonUniformImage: interpolated')
>>> im = mpl.image.NonUniformImage(ax, interpolation='bilinear')
>>> xcenters = xedges[:-1] + 0.5 * (xedges[1:] - xedges[:-1])
>>> ycenters = yedges[:-1] + 0.5 * (yedges[1:] - yedges[:-1])
>>> im.set_data(xcenters, ycenters, H)
>>> ax.images.append(im)
>>> ax.set_xlim(xedges[0], xedges[-1])
>>> ax.set_ylim(yedges[0], yedges[-1])
>>> ax.set_aspect('equal')
>>> plt.show()

源代码