我试图解决如何使用hist2d的返回值。我看到它返回2d数组(“直方图对象”)以及bin边缘和图像。我正在尝试做的是创建两个(基于某些物理数据的)直方图,对其进行归一化,然后将它们减去(即减去bin值),然后对剩下的部分进行直方图处理。
可以从这里开始:
h1 = plt.hist2d(x1, y1,bins=(100,100),normed=True)
h2 = plt.hist2d(x2, y2,bins=(100,100),normed=True)
h1和h2的长度实际上是4,其中h1 [0]是具有bin值的2d数组。我不清楚h1 1,h1 2和h1 [3]到底是什么,但是将它们相减会得到0的数组。但是,我可以减去h1 [0]和h2 [0]并得到有意义的bin值:
h1 = plt.hist2d(x1, y1,bins=(100,100),normed=True)
h2 = plt.hist2d(x2, y2,bins=(100,100),normed=True)
H = h1[0] - h2[0]
现在的问题是,如何对这些新值进行直方图绘制?我可以覆盖h1 [0],但是即使那样,如何在不使用不同类型的函数的情况下以相同格式重新绘制hist2d?使用histogram2d可以做类似的事情,也许可以使用网状网格,但是结果很难看:
h1, xedges, yedges = np.histogram2d(x1, y1,bins=(100,100),normed=True)
h2, xedges, yedges = np.histogram2d(x2, y2,bins=(100,100),normed=True)
H = h1 - h2
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(121, title='imshow: square bins')
plt.imshow(H, interpolation='nearest', origin='low',extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])
ax = fig.add_subplot(122, title='pcolormesh: actual edges')
X, Y = np.meshgrid(xedges, yedges)
ax.pcolormesh(X, Y, H)
plt.show()
正如一位评论者所指出的,这些图偏斜是有道理的,因为它们现在是(100,100)箱,而不是原始轴(0,1000),(-100,100)。这可以解决:
plt.imshow(H, interpolation='nearest', origin='low')
但是,输出然后会奇怪地旋转。我可以说出来,因为模糊的模糊条应该是垂直的:
最佳答案
两个问题。
您需要为两个直方图使用相同的bin,否则无法将它们相减。
除非确保密度指的是相同数量的点和相同的数据范围,否则不能减去密度。因为不可能有相同数量的点,所以请改为计算绝对频率,如果它们生活在相同的箱中,则可以很容易地减去它们。
因此需要
h1, xedges, yedges = np.histogram2d(x1, y1, bins=(100,100),normed=False)
h2, _, __ = np.histogram2d(x2, y2, bins=(xedges, yedges), normed=False)
H = h1 - h2
绘制时请注意,在绘制之前
np.histogram2d
needs to be transposed的输出数组;即plt.imshow(H.T, ...)
或plt.pcolormesh(X, Y, H.T, ...)
。关于python - 如何使用或操纵hist2d的输出(返回值)并创建新的直方图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59795238/