无法使用numpy.histogram2d和matplotlib绘制二维直方图

时间:2014-06-02 18:55:41

标签: python-2.7 numpy matplotlib

我有一个庞大的数据集,我需要将我的绘图分成网格并计算每个网格方块内的点数。我正在按照here概述的方法:

我的代码的精简版本如下:

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个随机点并尝试在二维直方图中绘制它们的代码:

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()

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

参考numpy histogram2d的文档...

细心的读者会注意到参数是向后的。

  

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

     

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

     

参数

     
    

x:array_like,shape(N,)         包含要点的x坐标的数组         直方图化。

         

y:array_like,shape(N,)         包含要点的y坐标的数组         直方图化。

  

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

此致