コンテンツにスキップ

可視化

SOPRANの図は、1つの配列をすぐに見るplot()と、複数の機器を同じ時間軸に縦に並べるPlotStackの2本立てです。 どちらもMatplotlibで描き、軸とカラーバーに変数名と単位を表示します。作図にはviz extraが必要です。

1つの配列を見る

flux = spn.kaguya.esa1.energy_flux.load(time)
result = flux.plot()

plot()は配列の次元から図の種類を選びます(mode="auto")。

次元 既定の図
timeのみ 折れ線
time × energy × pitch_angle ピッチ角と時刻、エネルギーと時刻の2段
それ以外の2次元以上(time × energy、time × energy × lookなど) スペクトログラム。横軸が時刻、縦軸がenergyなどの座標、色が値。余分な次元はreduction(既定"sum")で畳む

modeに"line"、"spectrogram"、"pitch"、"energy"を渡すと種類を固定できます。 xarrayのplot()を直接使いたいときはmode="raw"を指定します。 磁場のようなベクトルは、下のlines(components="xyz")で成分ごとの折れ線にします。

表示範囲と目盛りは次の引数で調整します。

引数 例
縦軸の範囲・目盛り ylim=(10, 10000)、yscale="log"
色の範囲・対数 vmin=1e6、vmax=1e9、log_color=True
縦軸に使う座標 y="energy"

エネルギーフラックスのように何桁にもまたがる量は、スキーマの指定(log_scale、log_dims)に従って、色とエネルギー軸を既定で対数表示にします。 現在はPACEのenergy_fluxとARTEMISのion_energy_flux・electron_energy_fluxがこの指定を持ちます。線形に戻すときはyscale="linear"、log_color=Falseを渡します。 既定は配列のplot()・quicklook()・spectrogram()でも、エンドポイントのspn.kaguya.esa1.energy_flux.plot(time)でも同じです。

複数の機器を並べる

時間軸を共有する多段図はspn.stack()で作ります。SPEDASのtplotに相当します。

stack = spn.stack(
    spn.kaguya.esa1.counts.load(time).spectrogram(y="energy", log_color=True),
    spn.kaguya.lmag.magnetic_field.load(time).lines(components="xyz"),
    spn.kaguya.orbit.altitude.load(time, cache="use").line(),
)
result = stack.plot()

パネルは配列のメソッドで作ります。

メソッド パネル
spectrogram(y=...) スペクトログラム。log_color、ylim、vmin、vmaxも指定できる
line() 1次元の時系列
lines(components="xyz") ベクトルの成分。components="xz"のように一部も選べる
histogram(bins=50) 値の分布
pitch_spectrogram()、energy_spectrogram(pitch=(0, 30)) ピッチ角スペクトルの断面

各パネルは機器ごとの元の時刻のまま描き、時間方向の補間はしません。値を同じ時刻にそろえて比較したい場合は 時刻をそろえるの方法を使います。

spectrogram()などはエンドポイントからも呼べます。この場合はstack.plot()を実行したときに読み込みます。

view = spn.view(time=time)
stack = spn.stack(
    view.kaguya.esa1.energy_flux.spectrogram(y="energy"),
    view.kaguya.lmag.magnetic_field.lines(components="xyz"),
)
stack.plan()     # 何を読むかを実行前に確認する

plot()済みの結果もspn.stack()に渡せます。ノートブックで1つずつ試した図を、後から1枚に並べ直せます。

スペクトルのピークを重ねる

peak_trace(axis="energy")は、各時刻で値が最大になるエネルギーを時系列として返します。 overlay()でスペクトログラムに重ねて表示できます。

ima = spn.kaguya.ima.counts.load(time)
peak = ima.peak_trace(axis="energy", min_value=5.0)

spn.stack(
    ima.spectrogram(y="energy", log_color=True).overlay(peak.line(name="energy_peak")),
).plot()

max_peaks=2で複数のピークを、method="prominence"で突出度による選択を使えます。 lookのような余分な次元は、既定で合計してから求めます。これは目視確認のための候補抽出で、 解析に使う判定基準は利用者が条件を決めて確かめてください。

Matplotlibで細部を調整する

plot()の返り値PlotResultは、Matplotlibのfigとaxesをそのまま持っています。

result = stack.plot()
result.axes[0].set_ylim(10, 1000)
result.fig.suptitle("IMA / LMAG")

保存前に同じ調整をしたいときは、関数をconfigureに渡します。

def configure(result):
    result.axes[-1].tick_params(axis="x", rotation=30)
    result.fig.tight_layout()

stack.quicklook("ima_lmag", root="reports", configure=configure)

図を保存する

quicklook(name, root=...)は、図と作成条件をまとめて保存します。SopranArrayとPlotStackの両方にあります。

formats 保存されるもの
("png",)(既定) PNGと、同名のJSON
("png", "html") 上記に加え、画像と記録を並べた簡易HTML

JSONには、パネルの種類・軸・色の指定、期間、座標系、処理履歴を記録します。 context=viewやcontext=caseを渡すと、その解析条件も記録します(期間・領域・解析条件)。

ブラウザで対話的に確かめたい場合はstack.explore()でPanelのアプリを作れます。