python
1fig = plt.figure(figsize=(7.5, 7.5)) 2ax = fig.add_subplot(111) 3 4X, Y = np.meshgrid(x[0:len(x)],y[0:len(y)]) #21 x 21 5F = np.array(F).reshape(len(x)-1,-1) #20 x 20 6 7m = ax.pcolormesh(X, Y, F, cmap='gray') 8fig.colorbar(m, label='A') 9 10plt.show()
用いるデータの一部を以下に示します。
列としては等級、フラックス、X, Yで並んでいます。
本来のデータは数十万行あります。
mag Flux X Y
16.78 0.0007045415735661775 329.399 42.232
16.806 0.0006878704054919076 329.023 42.052
13.317 0.017104351979956002 329.27 42.124
14.469 0.005919794420515654 328.675 41.868
15.511 0.0022672876636957917 329.196 41.957
16.706 0.0007542349013940496 329.374 42.217
16.051 0.0013788169862608637 329.501 42.265
16.962 0.0005958084044128775 329.141 42.167
15.238 0.0029154568968192433 328.801 41.978
16.209 0.0011920833578792421 329.246 42.019
14.663 0.004951156169049099 329.108 41.977
15.384 0.002548629026672342 329.15 42.032
15.111 0.0032772277608275092 328.878 41.979
15.681 0.0019386822097603555 329.284 42.092
16.151 0.0012574960369579535 329.339 42.157
上記のデータをnp.genfromtxtで読み込み、m = data[:,0], F_m = data[:,1]という風に読み込むと
python
1m = np.array([16.78 , 16.806, 13.317, 14.469, 15.511, 16.706, 16.051, 16.962, 15.238, 16.209, 14.663, 15.384, 15.111, 15.681, 16.151]) 2F_m = np.array([0.00070454, 0.00068787, 0.01710435, 0.00591979, 0.00226729, 0.00075423, 0.00137882, 0.00059581, 0.00291546, 0.00119208, 0.00495116, 0.00254863, 0.00327723, 0.00193868, 0.0012575 ]) 3X = np.array([329.399, 329.023, 329.27 , 328.675, 329.196, 329.374, 329.501, 329.141, 328.801, 329.246, 329.108, 329.15 , 328.878, 329.284, 329.339]) 4Y = np.array([42.232, 42.052, 42.124, 41.868, 41.957, 42.217, 42.265, 42.167, 41.978, 42.019, 41.977, 42.032, 41.979, 42.092, 42.157])
となると思います。
少し天文学の知識が必要になる質問です。
上記のコードはデータなどかなり飛ばして抜粋したものですが、やりたいこととしては、
横Xと縦Yの値があり、その間に入る高さFの値を2次元マップで書きたいというものです。
Xの値は328330くらい、Yの値は4143くらい、Fの値は0.0, 0.001...くらいで全て小数(float)です。
ただ単にグラフを描くだけであればこれで終わりなのですが、厄介なことにこのFはフラックスで、描画自体はフラックスのままでいいのですが最終的にカラーバーでフラックスを等級に換算して見やすくしたいです。
なお、Fの中にはあるX, Yの中にデータがないということを意味する0も含まれており、さらに以下に示すフラックスと等級の換算の式で等級がたまたま0になったという場合もあります。
うまくして、フラックスFが元から0であった箇所は真っ黒で、かつ、等級を計算した結果0になったものも含めて等級の値が小さくなると白く、値が大きくなると黒に近づくというカラーバーにしたいです。
おそらくマップ自体はフラックスの値が大きい方が等級が小さくなる、すなわち明るく、フラックスでマップを描いた時に白で表され、逆もまた然りなので大丈夫かなと思っています。
フラックス→等級の換算式
m = -2.5 * log10(F_m/F_0)
m : F_mに対応する等級 /mag
F_m : フラックス /Jy(ジャンスキー)
F_0 : AB等級でのVEGAのフラックス(=3630 /Jy)
難題かもしれませんがよろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー