はじめに
データ解析の中で、縦軸も横軸もスケールが広いケースってよくありますよね。そこで、便利なのが両対数表示です。
たとえば、天文系の解析をしていると、
- 可視光の相対測光の校正
- フラックスの波長依存性の確認
- パワースペクトル密度(PSD)の可視化
といった場面で、log-logスケールのグラフを描きたくなるわけです。
……でも、log-logって、案外一筋縄ではいかないんですよね。
そんなときに便利なのが、matplotlib の loglog()
関数。
これ、たった一行で両対数グラフにしてくれるんです。
「えっ、そんな関数あるの??何それ?」と思ったあなた、
ぜひこの記事で loglog()
の魅力をのぞいてみてください。
loglog()
の使い方
import matplotlib.pyplot as plt
import numpy as np
x = np.logspace(0.1, 2, 1000)
y = x ** -2
plt.loglog(x, y)
これだけで、両対数軸のグラフが一発で完成します!
筆者は loglog()
の存在を知ったとき、「えっ、これだけで済むの?」とちょっと感動しました。logスケールを設定するたびに毎回 xscale
と yscale
を手動で書いていたあの時間、一体なんだったのか……と思わずにはいられませんでした。
loglog()
の裏側
実は loglog()
の内部では、以下のような処理が行われています。
plt.plot(x, y)
plt.xscale('log')
plt.yscale('log')
つまり、plot()
のラッパー関数として、両軸をlogスケールに設定してくれるショートカットなんです。
そして実は、x軸だけ / y軸だけをlogにするためのヘルパー関数も用意されています。
それが semilogx()
(横軸だけlog)、 semilogy()
(縦軸だけlog)です。
plt.semilogx(x, y) # x軸だけlog
plt.semilogy(x, y) # y軸だけlog
scatter()
では使えない?と思ったら…
ここでちょっと注意点があります。
loglog()
や semilogx()
などは plt.plot()
のラッパー関数なので、plt.scatter()
には直接使えません。
でも、安心してください。ちょっとした工夫でちゃんと実現できます。
方法1:xscale()
/ yscale()
を手動で指定
plt.scatter(x, y)
plt.xscale('log')
plt.yscale('log')
このように、スケールを手動で設定すれば、scatter()
でも log-log 表示が可能です。
方法2:loglog()
をスケール設定のために使用
plt.scatter(x, y)
plt.loglog() # 何も描かずにスケールだけlogに設定
このように loglog()
を スケール設定だけの目的で使う 裏技もあります。
この方法は、semilogx()
や semilogy()
にもそのまま応用できます。
知らなかった人も多いのでは?
筆者も最初は「便利だけど、loglog
は scatter
では使えないのか…ちょっと寂しいな」と思っていました。
でも、この方法を知ってからは、logスケールでの可視化の選択肢が増えて、表現の幅がぐっと広がったように感じます。
まとめ
loglog()
は、両軸を一瞬でlogスケールにできる便利な関数です。
同様に、semilogx()
や semilogy()
を使えば、片対数グラフもすぐに描けます。
こういったヘルパー関数って意外と見落としがちで、発掘したときのちょっとした感動って、ふと記憶に残ってたりするんですよね。
気軽にlogスケールでプロットできるようになると、データ解析がサクサク進んで、ちょっと楽しくなってきます。
この記事が、同じような発掘を楽しむ方の役に立てたら嬉しいです。
参考