我有一系列(x,y)值,我想繪製使用python的matplotlib的二維直方圖。使用hexbin,我得到的是這樣的: alt text http://img121.imageshack.us/img121/1339/hexbin.png 但是我正在尋找這樣的事情: alt text http://img17.imageshack.us/img17/1927/recthist.png 示例代碼:python matplotlib矩形binning
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()
好像應該已經有一個辦法做到這一點,而無需編寫我的擁有「分箱」方法並使用imshow。
這是一維的。我正在尋找一個二維直方圖,類似於什麼imshow()或hexbin() – job 2010-01-09 01:17:22
* hist *可以做2D數據,除非我沒有明白你的觀點。如果您發佈了一些示例數據,那可能會有所幫助。 – Seth 2010-01-09 08:26:50
Hist處理二維數據,但它只創建兩個交錯的一維直方圖。 – 2010-01-15 15:58:07