14

matplotlibのメソッドhexbinを使用して、データの2Dヒストグラムを計算します。しかし、結果をさらに処理するために、六角形の中心の座標を取得したいと思います。

結果のメソッドを使用して値をget_array()取得しましたが、ビンの座標を取得する方法がわかりません。

ビンの数とデータの範囲を指定してそれらを計算しようとしましたが、各方向のビンの正確な数がわかりません。 gridsize=(10,2)トリックを行う必要がありますが、うまくいかないようです。

何か案が?

4

3 に答える 3

21

これでうまくいくと思います。

from __future__ import division
import numpy as np
import math
import matplotlib.pyplot as plt

def generate_data(n):
    """Make random, correlated x & y arrays"""
    points = np.random.multivariate_normal(mean=(0,0),
        cov=[[0.4,9],[9,10]],size=int(n))
    return points

if __name__ =='__main__':

    color_map = plt.cm.Spectral_r
    n = 1e4
    points = generate_data(n)

    xbnds = np.array([-20.0,20.0])
    ybnds = np.array([-20.0,20.0])
    extent = [xbnds[0],xbnds[1],ybnds[0],ybnds[1]]

    fig=plt.figure(figsize=(10,9))
    ax = fig.add_subplot(111)
    x, y = points.T
    # Set gridsize just to make them visually large
    image = plt.hexbin(x,y,cmap=color_map,gridsize=20,extent=extent,mincnt=1,bins='log')
    # Note that mincnt=1 adds 1 to each count
    counts = image.get_array()
    ncnts = np.count_nonzero(np.power(10,counts))
    verts = image.get_offsets()
    for offc in xrange(verts.shape[0]):
        binx,biny = verts[offc][0],verts[offc][1]
        if counts[offc]:
            plt.plot(binx,biny,'k.',zorder=100)
    ax.set_xlim(xbnds)
    ax.set_ylim(ybnds)
    plt.grid(True)
    cb = plt.colorbar(image,spacing='uniform',extend='max')
    plt.show()

ここに画像の説明を入力してください

于 2012-12-06T23:19:38.580 に答える
2

get_offsets() を使用してフックされたコードが機能することを確認したいと思いますが、上記のコードを何度か繰り返して中心位置を取得しようとしましたが、Dave が述べたように、get_offsets() は空のままです。私が見つけた回避策は、空でない 'image.get_paths()' オプションを使用することです。私のコードは中心を見つけるのに平均をとりますが、それはほんの少しだけ長いことを意味しますが、うまくいきます。

get_paths() オプションは、埋め込まれた一連の x、y 座標を返します。これをループして平均化すると、各ヘキサグラムの中心位置が返されます。

私が持っているコードは次のとおりです。

counts=image.get_array() #counts in each hexagon, works great
verts=image.get_offsets() #empty, don't use this
b=image.get_paths()   #this does work, gives Path([[]][]) which can be plotted

for x in xrange(len(b)):
    xav=np.mean(b[x].vertices[0:6,0]) #center in x (RA)
    yav=np.mean(b[x].vertices[0:6,1]) #center in y (DEC)
    plt.plot(xav,yav,'k.',zorder=100)
于 2013-08-01T01:25:54.973 に答える