= Plotの描画関連 = === 複数の時系列を縦に並べてplotする === [[https://gwpy.github.io/docs/stable/timeseries/plot.html#plotting-multiple-timeseries-together|ここ]]に書いてある、gwpy.plotのPlot()がオススメ。<
> GUIで拡大等をしたとき、他のaxesも一緒に動く。<
> 注意点は、TimeSeriesのlistやTimeSeriesDictを引数にしてまとめて渡した場合は ''separate=True'' をしても分割されないという謎仕様。面倒だが1つ1つ手で並べる必要がある。 {{{#!python from gwpy.plot import Plot plot = Plot(l1hoft, h1hoft, separate=True, sharex=True) plot.show() }}} {{https://gwpy.github.io/docs/stable/_images/plot-7.png}} 戻り値 (ここでは ''plot'')は、[[https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.figure.html|matplotlibのfigure]]だと思ってしまってよい。<
> なので、それぞれのy軸ラベルや全体のタイトルを付けるには以下のようにする。 {{{#!python import matplotlib.pyplot as plt axes = plot.get_axes() ylabel = ['y1','y2'] for i, ax in enumerate(axes): ax.set_ylabel(ylabel[i]) plt.tight_layout() plt.subplots_adjust(top=0.95) plot.suptitle('title') }}} === 時刻の基準を手で設定する === [[https://gwpy.github.io/docs/stable/timeseries/plot.html#plotting-multiple-timeseries-together|ここ]]を参照 {{{#!python ax = plot.gca() ax.set_epoch(1126259462) # GPS timeを入れる }}} もしくは[[https://gwpy.github.io/docs/stable/plot/gps.html|ここ]]参照 === DQ Flagを添える === ''.add_segments_bar()'' を使う([[https://gwpy.github.io/docs/latest/examples/miscellaneous/open-data-spectrogram.html|ここ]]を参照)。<
> 他にも ''.add_state_segments()'' や ''.add_dataqualityflag()'' といった似たものがある。詳細は[[https://gwpy.github.io/docs/latest/plotter/api.html#gwpy.plotter.Plot.add_line|Plotting API]]を参照。 {{https://gwpy.github.io/docs/latest/_images/open-data-spectrogram-5.png}} === スペクトルのパーセンタイル/σバンドを付ける === [[https://gwpy.github.io/docs/stable/examples/frequencyseries/percentiles.html|ここ]]を参照。手順としては、 1. まずTimeSeriesから[[https://gwpy.github.io/docs/stable/api/gwpy.timeseries.TimeSeries.html#gwpy.timeseries.TimeSeries.spectrogram2|spectrogram2()]]を使ってnon-averaged power Spectrogramを作る。 2. .percentile() でパーセンタイルのスペクトルを3つ作る。 3. plot_mmm() で描画するとバンド付きでplotされる。 {{{#!python from gwpy.timeseries import TimeSeries from gwpy.plot import Plot hoft = TimeSeries. ... sg = hoft.spectrogram2(fftlength=4, overlap=2, window='hanning') ** (1/2.) median = sg.percentile(50) low = sg.percentile(5) high = sg.percentile(95) plot = Plot() ax = plot.gca(xscale='log', xlim=(10, 1500), xlabel='Frequency [Hz]', yscale='log', ylim=(3e-24, 2e-20), ylabel=r'Strain noise [1/$\sqrt{\mathrm{Hz}}$]') ax.plot_mmm(median, low, high, color='gwpy:ligo-hanford') ax.set_title('LIGO-Hanford strain noise variation around GW170817', fontsize=16) plot.show() }}} {{https://gwpy.github.io/docs/stable/_images/percentiles-4.png}} パーセンタイルではなくmeanとσで表したい場合は、Spectrogramの2次元配列に対して時間軸(0軸)方向にmean, stdを取ればよい。 {{{#!python mean = FrequencySeries(data=sg.mean(0), frequencies=sg.frequencies) sigma = FrequencySeries(data=sg.std(0), frequencies=sg.frequencies) }}} == matplotlib色々 == * [[https://qiita.com/simonritchie/items/da54ff0879ad8155f441|プロットの複雑なレイアウトはGridSpecが便利かも、という話]] * [[https://bunseki-train.com/axvspan-and-axhspan/|matplotlibで一定区間に背景色をつける方法]] * [[https://qiita.com/nkay/items/d1eb91e33b9d6469ef51|matplotlibのめっちゃまとめ]] === imshow を使って2Dヒストグラムを書く時の軸の取り方 === 以下のような2変数f_in, f_outの間の相関データを、imshowを使って2Dヒストグラムとして描画したいとしよう。 {{{#!python matrix = [[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 2, 0], [0, 1, 0, 2], [1, 0, 2, 0]] f_in = [1,2,3,4] f_out = [1,2,3,4,5,6] }}} 素直に以下のように書くと、縦軸が反転して(上から下になる)しまい、bin幅もごみになる。 {{{#!python fig = Plot(figsize=(5, 5)) ax = fig.gca() ax.imshow(matrix, extent=[f_in[0], f_in[-1], f_out[0], f_out[-1]], aspect='auto', interpolation='nearest') ax.set_xlabel("Injected Noise Frequency $f'$ [Hz]") ax.set_ylabel('Obsurved Frequency $f$ [Hz]') fig.show() }}} {{attachment:imshow_bad.png}} 縦軸の向きは origin='lower' を入れると下から上になる。<
> bin幅については、上下左右に半分ずつ追加することで変数の値(今の場合はf_in, f_out)がbin中心になるようにできる。 {{{#!python df_in = f_in[1] - f_in[0] df_out = f_out[1] - f_out[0] f_L = f_in[0] - df_in*0.5 f_R = f_in[-1]+ df_in*0.5 f_B = f_out[0] - df_out*0.5 f_T = f_out[-1]+ df_out*0.5 fig = Plot(figsize=(5, 5)) ax = fig.gca() ax.imshow(matrix, extent=[f_L, f_R, f_B, f_T], aspect='auto', origin='lower', interpolation='nearest') ax.set_xlabel("Injected Noise Frequency $f'$ [Hz]") ax.set_ylabel('Obsurved Frequency $f$ [Hz]') fig.show() }}} {{attachment:imshow_good.png}} === TitleやLabelなどにアンダーバー(_)が含まれてると怒られる === 環境によっては起きない問題だが、例えば神岡のK1sum*とかで発生する。<
> pythonやmatplotlibのバージョンの問題化と思いきや、virtualenvで最新環境にしても生じるので原因はよくわからない。 とりあえず、頭に以下のおまじないを付けると解決する。 {{{#!python import matplotlib.pyplot as plt plt.rc('text.latex', preamble=r'\usepackage{underscore}') }}} === 正負両方の対数プロット === [[https://helve-blog.com/posts/python/matplotlib-object-oriented-logarithmic-graph/#%E6%AD%A3%E8%B2%A0%E4%B8%A1%E6%96%B9%E3%81%AE%E5%AF%BE%E6%95%B0%E3%83%97%E3%83%AD%E3%83%83%E3%83%88symlog]] {{{#!python x = np.arange(-10, 10) y = np.arange(-10, 10) fig, ax = plt.subplots() ax.plot(x, y) ax.set_yscale("symlog", linthreshy=1) ax.grid() plt.show() }}} {{attachment:xscale_symlog.png}}