あなたの好奇心を拾うための単なる提案です。 @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の例に基づいて以下のコードを検討
を
関数myplot()は私がするために書いただけの非常にシンプルな機能ですデータを正規化し、それをpy-sphviewerの入力として与える。平滑化カーネルの長さは、通常、平滑化が実行される近傍の数を指定するパラメータnbによって与えられます。一見すると複雑に見えますが、アイデアや実装は非常に簡単で、結果はnp.histogram2dと比較してはるかに優れています。もちろん、あなたのデータを広げることができるかどうか、そしてあなたの研究のためにそれを行うことの意味と結果はどうかによって異なります。
あなたのプロットをどのように見せたいか、あなたが持っているデータの種類を知らなくても、「正しくない」ということを知るのは難しいです。 – lanery
@ Lanery - あなたが正しいです。私は本当に素早く精巧な写真を追加しましょう。 – DarthLazar
問題はデータにあるようです。軸の制限が完全に異なることに注意してください。 – armatita