使用numpy.histogram2d和matplotlib绘制二维直方图时遇到困难

5

我有一个大型的数据集,需要把我的图分成网格并计算每个网格方格内的点数。我正在遵循这里所述的方法:

以下是我简化后的代码:

import numpy as np
import matplotlib.pyplot as plt

x = [ 1.83259571, 1.76278254, 1.38753676, 1.6406095, 1.34390352, 1.23045712, 1.85877565, 1.26536371, 0.97738438]

y = [ 0.04363323, 0.05235988, 0.09599311, 0.10471976, 0.1134464, 0.13962634, 0.17453293, 0.20943951, 0.23561945]

gridx = np.linspace(min(x),max(x),11)
gridy = np.linspace(min(y),max(y),11)

grid, _, _ = np.histogram2d(x, y, bins=[gridx, gridy])

plt.figure()
plt.plot(x, y, 'ro')
plt.grid(True)

plt.figure()
plt.pcolormesh(gridx, gridy, grid)
plt.plot(x, y, 'ro')
plt.colorbar()

plt.show()

问题出在网格识别绘图元素作为点出现的位置,但有些元素内部没有点;同样,在一些实际数据点出现的位置,网格并未将其识别为实际存在的点。 可能是什么原因导致这个问题?另外,很抱歉没有附上绘图,我是一个新用户,声望不够高。 更新:下面是生成100个随机点并尝试在2-D直方图中绘制它们的代码:
import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)

y = np.random.rand(100)

gridx = np.linspace(0,1,11)
gridy = np.linspace(0,1,11)

grid, __, __ = np.histogram2d(x, y, bins=[gridx, gridy])

plt.figure()
plt.plot(x, y, 'ro')
plt.grid(True)

plt.figure()
plt.pcolormesh(gridx, gridy, grid)
plt.plot(x, y, 'ro')
plt.colorbar()

plt.show()

然而,当我运行它时,仍然遇到了之前的问题:点的位置和颜色与点-位置-密度不一致。当其他人运行这段代码时,是否也会出现这种情况?

第二次更新

为了防止重复,这里提供一个参数绘图的代码:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0,1,100)
x = np.sin(t)
y = np.cos(t)

gridx = np.linspace(0,1,11)
gridy = np.linspace(0,1,11)

#grid, __, __ = np.histogram2d(x, y, bins=[gridx, gridy])
grid, __, __ = np.histogram2d(x, y)

plt.figure()
plt.plot(x, y, 'ro')
plt.grid(True)

plt.figure()
plt.pcolormesh(gridx, gridy, grid)
plt.plot(x, y, 'ro')
plt.colorbar()

plt.show()

这让我觉得这可能是某种奇怪的缩放问题。尽管如此,我仍然完全迷失了...

以上代码无法正常工作的原因可能是您的数据点不足。您似乎只有9个x和y的数据点。而您所遵循的示例具有100个数据点,如果使用9个数据点尝试相同的示例,则无法正常工作! - Srivatsan
np.histogram2d是否可能存在随机散布的小数字问题?我尝试了您建议的100个点,但仍然无法正常工作。奇怪的是,当我尝试将x和y设置为linspace(0,1,100)的测试用例时,colormesh函数完美地工作了。 - user3555455
2个回答

2

我通过使用带有插值的imshow而不是pcolormesh,成功地使您的示例运行起来。请参见以下示例代码。

我认为问题可能在于pcolormesh具有与plot不同的原点约定。 pcolormesh的结果看起来像左上角和右下角被翻转了。

使用imshow的结果如下所示:

imshow result

样本代码:

import numpy as np
import matplotlib.pyplot as plt

def doPlot():

    x = [ 1.83259571, 1.76278254, 1.38753676, 1.6406095, 1.34390352, 1.23045712, 1.85877565, 1.26536371, 0.97738438]

    y = [ 0.04363323, 0.05235988, 0.09599311, 0.10471976, 0.1134464, 0.13962634, 0.17453293, 0.20943951, 0.23561945]

    gridx = np.linspace(min(x),max(x),11)
    gridy = np.linspace(min(y),max(y),11)

    H, xedges, yedges = np.histogram2d(x, y, bins=[gridx, gridy])

    plt.figure()
    plt.plot(x, y, 'ro')
    plt.grid(True)

    #wrong origin convention for pcolormesh?
    #plt.figure()
    #plt.pcolormesh(gridx, gridy, H)
    #plt.plot(x, y, 'ro')
    #plt.colorbar()


    plt.figure()
    myextent  =[xedges[0],xedges[-1],yedges[0],yedges[-1]]
    plt.imshow(H.T,origin='low',extent=myextent,interpolation='nearest',aspect='auto')
    plt.plot(x,y,'ro')
    plt.colorbar()

    plt.show()

if __name__=="__main__":
    doPlot()

没错,就是这样。非常感谢。 - user3555455

0

参考numpy histogram2d的文档...

仔细阅读者会注意到参数是反过来的。

histogram2d(y, x, bins=(xedges, yedges)

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

参数

x:array_like,形状(N,) 包含要制作直方图的点的x坐标的数组。

y:array_like,形状(N,) 包含要制作直方图的点的y坐标的数组。

因此,您将x提供给了函数的y参数,反之亦然。

敬礼


在numpy 1.13中,这是不正确的:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.histogram2d.html - kadrlica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接