2016-04-07 15 views
0

これは2次元ヒストグラムに変換する前の私のプロットです。Python - 2次元ヒストグラムプロット対数スケール - エラー: `float NaNを整数に変換できません。 '

enter image description here

mass_bh = (subhalos['SubhaloBHMass'] * 1e10/0.704) # in units of M_sol h^-1 
vdisp = subhalos['SubhaloVelDisp'] 

nbins = 200 
H, xedges, yedges = np.histogram2d(mass_bh,vdisp,bins=nbins) 

fig2 = plt.figure() 
plt.pcolormesh(xedges,yedges,Hmasked) 
cbar = plt.colorbar() 
cbar.ax.set_ylabel('g-r') 

plt.ylabel(' $\log(\sigma)\quad$ [km s$^{-1}$] ') 
plt.xlabel('$\log(M_{BH})\quad$ [M$_{\odot}$]') 
plt.title('$M_{BH}-\sigma$ relation') 

これは代わりに、私の前のプロットは、対数スケールに変換し、そのxy値の両方を持っている私は、この

を与えます。しかし、このヒストグラム変換では、それほどうまくいきません。私はこの問題を回避するにはどうすればよい

enter image description here

ありがとうございました!

+0

あなたのプロットをどのように見せたいか、あなたが持っているデータの種類を知らなくても、「正しくない」ということを知るのは難しいです。 – lanery

+0

@ Lanery - あなたが正しいです。私は本当に素早く精巧な写真を追加しましょう。 – DarthLazar

+0

問題はデータにあるようです。軸の制限が完全に異なることに注意してください。 – armatita

答えて

2

@armatitaはデータの問題については正しいです。 histogram2dの中でどのようにあなたのビニングを行うのかがすべてわかると思います。ランダムな正規分布を持つこの例が役立つかどうかを見てください。

import numpy as np 
import matplotlib.pyplot as plt 

n = 1000 

x = np.logspace(2, 10, n) 
y = x**1.5 
y = y * np.random.lognormal(10, 3, n) 

x_bins = np.logspace(np.log10(x.min()), np.log10(x.max()), np.sqrt(n)) 
y_bins = np.logspace(np.log10(y.min()), np.log10(y.max()), np.sqrt(n)) 
H, xedges, yedges = np.histogram2d(x, y, bins=[x_bins, y_bins]) 

fig = plt.figure() 
ax1 = fig.add_subplot(211) 
ax1.plot(x, y, 'o') 
ax1.set_xscale('log') 
ax1.set_yscale('log') 

ax2 = fig.add_subplot(212) 
ax2.pcolormesh(xedges, yedges, H.T) 
ax2.set_xscale('log') 
ax2.set_yscale('log') 

私はあなたが探していると信じている以下のイメージを取得します。また、Hの転記にも注意してください。 enter image description here

+0

クール!ありがとうございました。一つのことは、 'np.log10(vdisp.max()))])'から 'float NaNを整数に変換できない 'というエラーです。また、いくつかの事柄はlog10で0で割られます。 – DarthLazar

+0

これらはどちらもあなたのデータの問題なので、あなたのデータセットに 'nan'がある理由を調べたいと思うかもしれませんが、その間に' np.nanmin' 「ナノ」を無視する。 [this post](http://stackoverflow.com/questions/2821072/is-there-a-better-way-of-making-numpy-argmin-ignore-nan-values?rq=1)を参照してください。 – lanery

+0

2ヒストグラムのbin部分にnp.minを適用しますか? – DarthLazar

1

あなたの好奇心を拾うための単なる提案です。 @laneryはこの質問に明確に答えていますが、Pythonで2dヒストグラムを得る別の方法を共有したいと思います。一般的にかなり醜いヒストグラムを生成するnp.histogram2dを使う代わりに、適応スムージングカーネルを使ってパーティクルシミュレーションをレンダリングするためのPythonパッケージpy-sphviewerをリサイクルしたいと思います。 SPH以下の出力を生成

def myplot(x, y, extent=None, nb=8, xsize=500, ysize=500): 
    if(extent == None): 
     xmin = np.min(x) 
     xmax = np.max(x) 
     ymin = np.min(y) 
     ymax = np.max(y) 
    else: 
     xmin = extent[0] 
     xmax = extent[1] 
     ymin = extent[2] 
     ymax = extent[3] 

    k, = np.where((x <= xmax) & (x >= xmin) & 
        (y <= ymax) & (y >= ymin)) 

    pos = np.zeros([3, len(k)]) 
    pos[0,:] = (x[k]-xmin)/(xmax-xmin) 
    pos[1,:] = (y[k]-ymin)/(ymax-ymin) 
    w = np.ones(len(k)) 

    P = sph.Particles(pos, w, nb=nb) 
    S = sph.Scene(P) 
    S.update_camera(r='infinity', x=0.5, y=0.5, z=0, 
        extent=[-0.5,0.5,-0.5,0.5], 
        xsize=xsize, ysize=ysize) 
    R = sph.Render(S) 
    R.set_logscale() 
    img = R.get_image() 

    return img, [xmin,xmax,ymin,ymax]  


n = 1000 

x = np.logspace(2, 10, n) 
y = x**1.5 
y = y * np.random.lognormal(10, 3, n) 

H, xedges, yedges = np.histogram2d(x, y, bins=[np.logspace(np.log10(x.min()), np.log10(x.max())), 
               np.logspace(np.log10(y.min()), np.log10(y.max()))]) 


img, extent = myplot(np.log10(x), np.log10(y)) #Call the function to make the 2d-histogram 

fig = plt.figure() 
ax1 = fig.add_subplot(311) 
ax1.plot(x, y, 'o') 
ax1.set_xscale('log') 
ax1.set_yscale('log') 

ax2 = fig.add_subplot(312) 
ax2.pcolormesh(xedges, yedges, H.T) 
ax2.set_xscale('log') 
ax2.set_yscale('log') 

ax3 = fig.add_subplot(313) 
ax3.imshow(img, origin='lower', extent=extent, aspect='auto') 

plt.show() 

としてPLT インポートsphviewerとしてNP インポートmatplotlib.pyplotとして

インポートnumpyの:laneryの例に基づいて以下のコードを検討

enter image description here

関数myplot()は私がするために書いただけの非常にシンプルな機能ですデータを正規化し、それをpy-sphviewerの入力として与える。平滑化カーネルの長さは、通常、平滑化が実行される近傍の数を指定するパラメータnbによって与えられます。一見すると複雑に見えますが、アイデアや実装は非常に簡単で、結果はnp.histogram2dと比較してはるかに優れています。もちろん、あなたのデータを広げることができるかどうか、そしてあなたの研究のためにそれを行うことの意味と結果はどうかによって異なります。

関連する問題