我有一系列(x,y)值,我想用python的matplotlib绘制二维直方图。使用hexbin,我得到这样的结果: 但我在找这样的东西: 示例代码:
from matplotlib import pyplot as plt
import random
foo = lambda : random.gauss(0.0,1.0)
x = [foo() for i in xrange(5000)]
y = [foo() for i in xrange(5000)]
pairs = zip(x,y)
#using hexbin I supply the x,y series and it does the binning for me
hexfig = plt.figure()
hexplt = hexfig.add_subplot(1,1,1)
hexplt.hexbin(x, y, gridsize = 20)
#to use imshow I have to bin the data myself
def histBin(pairsData,xbins,ybins=None):
if (ybins == None): ybins = xbins
xdata, ydata = zip(*pairsData)
xmin,xmax = min(xdata),max(xdata)
xwidth = xmax-xmin
ymin,ymax = min(ydata),max(ydata)
ywidth = ymax-ymin
def xbin(xval):
xbin = int(xbins*(xval-xmin)/xwidth)
return max(min(xbin,xbins-1),0)
def ybin(yval):
ybin = int(ybins*(yval-ymin)/ywidth)
return max(min(ybin,ybins-1),0)
hist = [[0 for x in xrange(xbins)] for y in xrange(ybins)]
for x,y in pairsData:
hist[ybin(y)][xbin(x)] += 1
extent = (xmin,xmax,ymin,ymax)
return hist,extent
#plot using imshow
imdata,extent = histBin(pairs,20)
imfig = plt.figure()
implt = imfig.add_subplot(1,1,1)
implt.imshow(imdata,extent = extent, interpolation = 'nearest')
plt.draw()
plt.show()
似乎已经有一种方法可以做到这一点,而不必编写自己的“binning”方法并使用imshow。
我刚刚提交了这个https://github.com/matplotlib/matplotlib/pull/805的请求。希望能被接受。
我意识到有一个补丁提交给matplotlib,但我采用了另一个示例中的代码来满足我的一些需求。
现在直方图是从左下角开始绘制的,就像传统的数学(不是计算)一样
此外,binning范围之外的值将被忽略,我将二维numpy数组用于二维数组
我将数据输入从成对更改为两个1D数组,因为这是数据被提供给散点(x,y)和类似函数的方式
Numpy有一个名为histogram2d的函数,它的docstring还向您展示了如何使用Matplotlib可视化它。将
interpolation=nearest
添加到imshow调用以禁用插值。相关问题 更多 >
编程相关推荐