はじめに
天文学では、連星系の公転運動など、周期的に変動する天体を複数周期にわたって観測することがあります。
こうしたデータをプロットするとき、少し悩むのが位相と観測周期をどう区別するかという問題です。
例えば、同じ軌道位相でも1周目と2周目の観測結果は異なる場合があります。そのため、何周目のデータなのかは区別したい一方で、位相による変化も分かりやすく表示したいところです。
もちろん、周回ごとにマーカーの形状を変えたり、色を変えたり、図を分けたりと、いろいろな方法が考えられます。
今回はその一つとして、位相に応じて色を変えつつ、周回ごとに色のトーンを少し変えることで、視認性を改善できないか試してみました。
特に深い解析ではなく、普段の研究で使うプロットを少し工夫してみた記録です。
やってみる
今回は2周期分の模擬観測データを用意し、視線速度(RV)と等価幅(EW)の変動を考えます。
色の付け方にはHSV色空間を使います。
HSVは色相(Hue)、彩度(Saturation)、明度(Value)で色を表現する方法です。
今回は、それぞれを次のように使ってみます。
- 色相(H):軌道位相に対応させ、1周期で色が一周するようにする。
- 彩度・明度(S・V):2周目では少し値を下げ、色のトーンを変える。
- マーカー:1周目は丸、2周目は三角にする。
位相は、
\phi=\left(\frac{t}{P}\right)\bmod 1
で計算します。
これなら、同じ位相では似た色相を保ちながら、何周目の観測なのかも区別できそうです。
Pythonコード
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import hsv_to_rgb
# 2周期の模擬データ
rng = np.random.default_rng(42)
P, n = 5.6, 65
t = np.sort(np.r_[rng.uniform(0, P, n), rng.uniform(P, 2 * P, n)])
cycle = (t // P).astype(int)
phase = (t / P) % 1
rv = 180 * np.sin(2 * np.pi * (phase - 0.1)) + 25 * cycle
rv += rng.normal(0, 10, t.size)
ew = 55 + 18 * np.cos(2 * np.pi * (phase - 0.3)) - 8 * cycle
ew += rng.normal(0, 2.2, t.size)
# 位相は色相、周期はマーカーと色の濃さで表示
S, V = [0.95, 0.72], [0.98, 0.60]
markers = ['o', '^']
def rgb(phi, k):
return hsv_to_rgb(np.column_stack([
np.asarray(phi) % 1, np.asarray(S)[k], np.asarray(V)[k]
]))
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4.8), sharey=True)
for k in (0, 1):
m = cycle == k
for ax, x in ((ax1, t), (ax2, rv)):
ax.scatter(x[m], ew[m], c=rgb(phase[m], cycle[m]),
marker=markers[k], s=42, edgecolors='k',
linewidths=0.3, label=f'Cycle {k+1}')
ax1.axvline(P, color='0.5', ls='--', lw=1)
ax1.set(xlabel='Time (days)', ylabel='EW (arb. units)', title='Time evolution', xlim=(0, 2*P))
ax2.set(xlabel='Radial velocity (km/s)', title='Velocity–EW relation')
ax2.legend(fontsize=9)
for ax in (ax1, ax2):
ax.grid(alpha=0.2)
# 2段の位相カラーバー
p = np.linspace(0, 1, 512, endpoint=False)
bar = np.stack([rgb(p, np.full(p.size, k)) for k in (1, 0)])
fig.subplots_adjust(left=0.09, right=0.98, top=0.91, bottom=0.36, wspace=0.12)
cax = fig.add_axes([0.28, 0.12, 0.46, 0.105])
cax.imshow(bar, origin='lower', extent=[0, 1, 0, 2], aspect='auto')
cax.set(yticks=[0.5, 1.5], yticklabels=['Cycle 2', 'Cycle 1'],
xticks=np.linspace(0, 1, 5), xlabel='Orbital phase')
cax.tick_params(axis='y', length=0)
plt.savefig('phase_hsv_memo.png', dpi=200)
plt.show()
結果
左側は時間に対するEWの変化、右側はRVとEWの関係です。
時間–EWの図では、位相に応じて色が変化し、2周目では少し暗めの色になっています。
一方、RV–EWの散布図では、時間軸がないため、どの点がどの位相に対応するのか分かりにくくなります。そこで位相を色で表現すると、各点の位相を色から追うことができます。
また、周回ごとにマーカーを変えているので、色の違いだけに頼らずにデータを区別できます。
今回は2周目の彩度と明度を少し下げてみましたが、色相によっては違いが分かりにくい部分もありそうです。
このあたりは背景色やマーカーの大きさなどによっても印象が変わると思います。
おわりに
周期的な観測データを見やすく整理する方法として、今回はHSVによる色分けとマーカーの変更を組み合わせてみました。
位相を色で表現するだけでも十分な場合がありますし、周回ごとにマーカーを変えるだけでもよいと思います。
ただ、色相で位相を表現しながら、周回ごとに彩度や明度を少し変えるという方法も、場合によっては使えそうです。
もちろん、情報を詰め込みすぎるとかえって分かりにくくなるので、実際のデータや図の目的に応じて使い分けるのがよさそうです。
今回は、日々の研究で使うプロットのちょっとした工夫として残しておきます。
