散布図としてプロットするのは簡単ですが、ヒートマップとして表現したい X、Y データ ポイント (約 10k) のセットがあります。
私は MatPlotLib の例を調べましたが、それらはすべて、画像を生成するためのヒートマップ セル値から既に始まっているようです。
すべて異なるx、yの束をヒートマップに変換する方法はありますか(x、yの頻度が高いゾーンは「暖かく」なります)?
散布図としてプロットするのは簡単ですが、ヒートマップとして表現したい X、Y データ ポイント (約 10k) のセットがあります。
私は MatPlotLib の例を調べましたが、それらはすべて、画像を生成するためのヒートマップ セル値から既に始まっているようです。
すべて異なるx、yの束をヒートマップに変換する方法はありますか(x、yの頻度が高いゾーンは「暖かく」なります)?
六角形が必要ない場合は、numpyのhistogram2d
関数を使用できます。
import numpy as np
import numpy.random
import matplotlib.pyplot as plt
# Generate some test data
x = np.random.randn(8873)
y = np.random.randn(8873)
heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.clf()
plt.imshow(heatmap.T, extent=extent, origin='lower')
plt.show()
これにより、50x50のヒートマップが作成されます。たとえば、512x384が必要な場合はbins=(512, 384)
、への呼び出しを行うことができますhistogram2d
。
例:
Matplotlibレキシコンでは、hexbinプロットが必要だと思います。
このタイプのプロットに慣れていない場合は、xy 平面が六角形の規則的なグリッドで分割された単なる二変量ヒストグラムです。
したがって、ヒストグラムから、各六角形に含まれるポイントの数を数え、プロット領域を一連のウィンドウとして離散化し、各ポイントをこれらのウィンドウの 1 つに割り当てることができます。最後に、ウィンドウをカラー配列にマップすると、hexbin ダイアグラムが得られます。
円や四角形ほど一般的ではありませんが、ビニング コンテナーのジオメトリには六角形が適していることは直感的にわかります。
六角形には最近傍対称性があります(たとえば、正方形のビンには対称性がありません。たとえば、正方形の境界上の点からその正方形の内側の点までの距離は、どこでも同じというわけではありません)。
六角形は、通常の平面テッセレーションを提供する最高の n ポリゴンです(つまり、キッチンの床を六角形のタイルで安全に再モデル化できます。これは、終了時にタイル間に隙間がなくなるためです。他のすべての上位 n、n >= 7、ポリゴン)。
( Matplotlibはhexbinプロットという用語を使用します。(AFAIK) Rのすべてのプロット ライブラリも同様です。それでも、これがこのタイプのプロットに対して一般的に受け入れられている用語であるかどうかはわかりませんが、hexbinが短いことを考えると、おそらくそうであると思われます表示用のデータを準備する際の重要な手順を説明する六角形ビニングの場合)。
from matplotlib import pyplot as PLT
from matplotlib import cm as CM
from matplotlib import mlab as ML
import numpy as NP
n = 1e5
x = y = NP.linspace(-5, 5, 100)
X, Y = NP.meshgrid(x, y)
Z1 = ML.bivariate_normal(X, Y, 2, 2, 0, 0)
Z2 = ML.bivariate_normal(X, Y, 4, 1, 1, 1)
ZD = Z2 - Z1
x = X.ravel()
y = Y.ravel()
z = ZD.ravel()
gridsize=30
PLT.subplot(111)
# if 'bins=None', then color of each hexagon corresponds directly to its count
# 'C' is optional--it maps values to x-y coordinates; if 'C' is None (default) then
# the result is a pure 2D histogram
PLT.hexbin(x, y, C=z, gridsize=gridsize, cmap=CM.jet, bins=None)
PLT.axis([x.min(), x.max(), y.min(), y.max()])
cb = PLT.colorbar()
cb.set_label('mean value')
PLT.show()
一般的に非常に醜いヒストグラムを生成する np.hist2d を使用する代わりに、適応平滑化カーネルを使用して粒子シミュレーションをレンダリングするための python パッケージであり、pip から簡単にインストールできるpy-sphviewerをリサイクルしたいと思います (Web ページのドキュメントを参照)。例に基づいた次のコードを検討してください。
import numpy as np
import numpy.random
import matplotlib.pyplot as plt
import sphviewer as sph
def myplot(x, y, nb=32, xsize=500, ysize=500):
xmin = np.min(x)
xmax = np.max(x)
ymin = np.min(y)
ymax = np.max(y)
x0 = (xmin+xmax)/2.
y0 = (ymin+ymax)/2.
pos = np.zeros([len(x),3])
pos[:,0] = x
pos[:,1] = y
w = np.ones(len(x))
P = sph.Particles(pos, w, nb=nb)
S = sph.Scene(P)
S.update_camera(r='infinity', x=x0, y=y0, z=0,
xsize=xsize, ysize=ysize)
R = sph.Render(S)
R.set_logscale()
img = R.get_image()
extent = R.get_extent()
for i, j in zip(xrange(4), [x0,x0,y0,y0]):
extent[i] += j
print extent
return img, extent
fig = plt.figure(1, figsize=(10,10))
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
# Generate some test data
x = np.random.randn(1000)
y = np.random.randn(1000)
#Plotting a regular scatter plot
ax1.plot(x,y,'k.', markersize=5)
ax1.set_xlim(-3,3)
ax1.set_ylim(-3,3)
heatmap_16, extent_16 = myplot(x,y, nb=16)
heatmap_32, extent_32 = myplot(x,y, nb=32)
heatmap_64, extent_64 = myplot(x,y, nb=64)
ax2.imshow(heatmap_16, extent=extent_16, origin='lower', aspect='auto')
ax2.set_title("Smoothing over 16 neighbors")
ax3.imshow(heatmap_32, extent=extent_32, origin='lower', aspect='auto')
ax3.set_title("Smoothing over 32 neighbors")
#Make the heatmap using a smoothing over 64 neighbors
ax4.imshow(heatmap_64, extent=extent_64, origin='lower', aspect='auto')
ax4.set_title("Smoothing over 64 neighbors")
plt.show()
次の画像が生成されます。
ご覧のとおり、画像はかなりきれいに見え、さまざまな部分構造を識別することができます。これらの画像は、特定のドメイン内のすべてのポイントに特定の重みを分散させて構築されます。これは、平滑化の長さによって定義されます。これは、より近いnb近傍までの距離によって与えられます (例では 16、32、および 64 を選択しました)。そのため、通常、密度の高い領域は、密度の低い領域と比較して、小さな領域に広がっています。
関数 myplot は、x、y データを py-sphviewer に渡して魔法を実行するために作成した非常に単純な関数です。
Seabornには、ここでうまく機能するjointplot 関数が含まれるようになりました。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# Generate some test data
x = np.random.randn(8873)
y = np.random.randn(8873)
sns.jointplot(x=x, y=y, kind='hex')
plt.show()
最終的な画像のセルに対応する 2 次元配列を作成し、heatmap_cells
それをすべてゼロとしてインスタンス化します。
次元ごとに、各配列要素間の差を実単位で定義する 2 つのスケーリング係数を選択します (例:x_scale
および ) y_scale
。すべてのデータポイントがヒートマップ配列の境界内に収まるようにこれらを選択してください。
x_value
とを使用した各生データポイントについてy_value
:
heatmap_cells[floor(x_value/x_scale),floor(y_value/y_scale)]+=1