メインコンテンツへスキップ
  1. Posts/

TNG_catcher.plot_tools

TNG_catcher/ TNG_catcher.plot_tools


次の一行でモジュールを読み込みます。

from TNG_catcher import *

このモジュールは次のクラスが定義されてあります。

  • extract_subhalo_data
  • (順次作成中)

はじめに
#

そこでこれらを簡単に取得したい/解析したいと思い、このモジュールを作成しました。

解析データの挿入(インスタンスの作成)
#

import numpy as np

dd = np.load("data.npz")
test = plot_tools(dd)

インスタンスを作成するにあたり、読み込むのはNpzFileです。extract_subhalo_dataクラスなどで出力したものを使用します。独自に抽出したデータでも構いません。

簡易描画する
#

「しっかり描画したい」とき、「簡易的に描画したい」ときというのがあると思います。

例えば、どんな概形かを知れればよく、解析途中であるときというのは、描画はなるだけ簡易的であるほうがいいです。そういうような場合は、simple_plot()メソッドを使いましょう。容量はあまり使わず、時間をかけずに描画できるように設計しています。

simple_plot()メソッド
#

simple_plot()メソッドは、matplotlib.pyplotモジュールを使って、簡易的に描画します。

test.simple_plot('x','y','Density')

引数に使用できるのは、NpzFileに含まれるキーです。

次のコマンドで使用できるキーを確認してください。

dd.files

また、独自に抽出したデータを使用する場合は、dd.filesと同じように、キーを確認し、使用するキーのデータは1次元であることを確認してください。

パラメータ
#

test.simple_plot(x, y, z, bins=301, log=True, fast=False, savefig="")
  • x: x軸に使用するキー (array_like, shape (N,))
  • y: y軸に使用するキー (array_like, shape (N,))
  • z: z軸に使用するキー (array_like, shape (N,))
  • bins: ピクセル数 (int, default: 301)
  • log: 対数軸にするかどうか (bool, default:True)
  • fast: 速度を優先するかどうか (bool, default:False)
    • Falseのときは、pcolormeshを使用。
    • Trueのときは、imshowを使用。
  • savefig: 画像を保存するかどうか (str, default: "")
    • ""のときは、保存しない。
    • 保存するときは、ファイル名を指定する。
    • 同じファイル名の場合は、上書きせずに、連番をつけて自動的に保存します。

動作原理
#

numpy.histogram2dを使用して、データを2次元配列に変換して描画を行う。

デフォルトでは300×300に設定してある。

Pythonの仕様により、bins=301と+1されている。

このとき、集計する際にそれぞれの点では重み付けを行う。

この重み付けに使用するのが、パラメータのzである。

つまり、ラスタライズ画像を生成しているのに他ならない。

白塗りを消したい
#

データ量が少ない(=ログを取れない)箇所に白塗りが出てしまうことがあります。これは少しダサイので、消したいと思います。

from matplotlib.colors import SymLogNorm
x,y,z = dd['x'], dd['y'], dd['Density']
bins = 801
xbins = np.linspace(x.min(), x.max(), bins)
ybins = np.linspace(y.min(), y.max(), bins)
hist, xed, yed = np.histogram2d(x, y, bins=(xbins, ybins), weights=z)
plt.imshow(hist.T, origin='lower', norm=SymLogNorm(linthresh=hist[hist>0].min(),vmin=hist[hist>0].min(), vmax=hist.max()))
plt.axis("off")
plt.colorbar()
plt.savefig("cg_sub.png",dpi=400)

観測対象を回転させる
#

観測対象によっては、以下のように回転させたほうが見やすい場合があります。

背景はデータ数が少ない(ログをとることによって、値を定められない)箇所になります。バージョンによっては、これが解消されています。

test.simple_plot('x','y','Density')

rot_x(), rot_y(), rot_z()メソッド
#

これらのメソッドは、dd.filesに含まれるキー内に「x」,「y」,「z」のすべて存在する場合に利用できます。

先程、プロットした図は横軸にx軸、縦軸にy軸をとっているので、次のような座標系になります。

それゆえ、銀河は次のような位置にあることになり、おおよそy軸に対して-45°すればいいことも分かります。

この場合、rot_y()メソッドを使用します。

test.rot_y(-45)

これによって、インスタンスtest内の座標系が回転されました。

test.simple_plot('x','y','Density',fast=True)

再度、xy平面をプロットしてみると、銀河が45°回転していることが分かります。そして、もう少し別の軸を回転したほうが良さそうです。そこで、zy平面をプロットしてみます。

test.simple_plot('z','y','Density',fast=True)

今度は、x軸に対して60°回転したほうが良さそうです。そこで、rot_x()メソッドを使用します。

test.rot_x(60)
test.simple_plot('z','y','Density',fast=True)

いい感じに回転ができました。

test.simple_plot('x','y','Density',fast=True)

save_rot()メソッド
#

今回の観測対象に作用させた回転行列を保存することができます。保存するにはsave_rot()メソッドをしようします。

引数にはファイル名を書きます。

保存形式はnpy形式です。

拡張子は含めても含めなくてもどちらでも構いません。

test.save_rot("rotation_data")

インスタンス内で回転動作を記録しており、それを出力時に回転行列に変換しています。

faceonにする
#

set_faceon() メソッド
#

温度を計算する
#

get_temp()メソッド
#

温度を計算するには、get_temp()メソッドを使用します。

これを計算するには次のキーが必要です。

  • ElectronAbundance
  • InternalEnergy
test.get_temp()

計算結果は、インスタンス内に保存されます。また、この関数は温度データを返します。

パラメータ
#

test.get_temp()
  • return: Temperature (array_like, shape (N,))

インスタンス内データを表示する
#

show()メソッド
#

一括ですべての表示するには、show()メソッドを使用します。

test.show()

インスタンスを保存したい
#

計算をしたり、回転行列を作用させたとき、そのままの状態で保存したいときがあるかと思います。

そのときはsave_npz()メソッドを利用しましょう。

どのような回転作用を与えたかだけを保存したい、すべては保存したくないようなときはsave_rot()メソッドが有効です。

save_npz()メソッド
#

引数にはファイル名を書きます。

保存形式はnpz形式です。

拡張子は含めても含めなくてもどちらでも構いません。

test.save_npz('converted_data')

メソッド内では、numpy.savezが動いているだけです。


$$ R_x(\theta) = \begin{pmatrix} 1 & 0 & 0 \cr 0 & \cos\theta & -\sin\theta \cr 0 & \sin\theta & \cos\theta \end{pmatrix} $$

$$ R_y(\theta) = \begin{pmatrix} \cos\theta & 0 & \sin\theta \cr 0 & 1 & 0 \cr -\sin\theta & 0 & \cos\theta \end{pmatrix} $$

$$ R_z(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta & 0 \cr \sin\theta & \cos\theta & 0 \cr 0 & 0 & 1 \end{pmatrix} $$