19

Pythonのmatplotlibを使用して2次元ヒストグラムをプロットしたい一連の(x、y)値があります。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()

私自身の「ビニング」メソッドを作成してimshowを使用せずに、これを行う方法がすでにあるはずです。

4

5 に答える 5

12

Numpy にはhistogram2dという関数があり、そのドキュメント文字列には、Matplotlib を使用して視覚化する方法も示されています。interpolation=nearestimshow 呼び出しに追加して、補間を無効にします。

于 2010-01-15T15:57:15.677 に答える
2

matplotlib に提出されたパッチがあることは認識していますが、私が持っていたいくつかのニーズに対応するために、他の例のコードを採用しました。

ヒストグラムは、従来の数学 (計算ではない) のように、左下隅からプロットされるようになりました。

また、ビニング範囲外の値は無視され、2次元配列に2次元numpy配列を使用します

データ入力をペアから 2 つの 1D 配列に変更しました。これは、データが scatter(x,y) および同様の関数に提供される方法であるためです。

def histBin(x,y,x_range=(0.0,1.0),y_range=(0.0,1.0),xbins=10,ybins=None):
    """ Helper function to do 2D histogram binning
        x, y are  lists / 2D arrays 
        x_range and yrange define the range of the plot similar to the hist(range=...) 
        xbins,ybins are the number of bins within this range.
    """

    pairsData = zip(x,y)

    if (ybins == None):
        ybins = xbins
    xdata, ydata = zip(*pairsData)
    xmin,xmax = x_range
    xmin = float(xmin)
    xmax = float(xmax)

    xwidth = xmax-xmin
    ymin,ymax = y_range    
    ymin = float(ymin)
    ymax = float(ymax)
    ywidth = ymax-ymin

    def xbin(xval):
        return floor(xbins*(xval-xmin)/xwidth) if xmin <= xval  < xmax else xbins-1 if xval ==xmax else None


    def ybin(yval):
        return floor(ybins*(yval-ymin)/ywidth) if ymin <= yval  < ymax else ybins-1 if yval ==ymax else None

    hist = numpy.zeros((xbins,ybins)) 
    for x,y in pairsData:
        i_x,i_y = xbin(x),ybin(ymax-y)
        if i_x is not None and i_y is not None:
            hist[i_y,i_x] += 1 

    extent = (xmin,xmax,ymin,ymax)

    return hist,extent
于 2012-06-01T17:22:58.727 に答える
1

このhttps://github.com/matplotlib/matplotlib/pull/805のプルリクエストを送信しました。うまくいけば、それは受け入れられます。

于 2012-03-28T21:28:58.940 に答える
0

matplotlib.pyplot.histお探しのものはありますか?

>>> help(matplotlib.pyplot.hist)
Help on function hist in module matplotlib.pyplot:

hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, botto
m=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=Fa
lse, hold=None, **kwargs)
    call signature::

      hist(x, bins=10, range=None, normed=False, cumulative=False,
           bottom=None, histtype='bar', align='mid',
           orientation='vertical', rwidth=None, log=False, **kwargs)

    Compute and draw the histogram of *x*. The return value is a
    tuple (*n*, *bins*, *patches*) or ([*n0*, *n1*, ...], *bins*,
    [*patches0*, *patches1*,...]) if the input contains multiple
    data.
于 2010-01-09T00:54:15.247 に答える
0

と を使用xlimylimて、プロットの範囲を設定します。xlim(-3, 3)そしてylim(-3, 3)やるべきです。

于 2010-11-19T02:44:42.153 に答える