Translate

データの行数が違うデータをとりあえずmatplotlibで重ね書きする方法【matplotlib、numpy、ループ回路】

いろいろデータを扱っていると、データをグラフ描写したくなりますよね。特に長い時系列のデータを扱っていると、特定の区間でデータを重ね書きして描写したくなります。

しかし周期データが確実にそろっているのであれば、二次元配列から重ね書きすることでmatplotlibで簡単に行うできるのですが、時には、データ数が周期毎に異なることがあります。

そういったデータを重ね書きしようとするとmatplotlibやnumpyからデータ数が違うとエラーを吐かれてしまいます。そういったデータを重ね書きをする場合には、ループ回路などを駆使してmatplotlibのコードを書く必要があります。

今回は、そういったちょっとmatplotlibでは扱いにくい、データ数の異なる配列を重ね書きしてグラフ描写する方法の一例について紹介したいと思います。

一番手っ取り早いのは、ループ回路内にmatplotlibのグラフ描写のコードを入れて、一区間ごとに書き出す処理がいい感じ。




一番楽にデータ数の違う配列を一つのグラフに重ね書きする処理をする方法としては、ループ回路を用いるのが楽でしょう。ループ回路は最初はとっつきにくい所はありますが、一度習得してしまうと、非常に強い武器になるといえます。


コードとしてはこんな感じです。


import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
fig = plt.figure(figsize = (10,10) )
ax1 = fig.add_subplot(1,1,1)
data = np.array(入れたいデータ)
p1 = signal.argrelmax(data)[0]
p2 = signal.argrelmin(data)[0]
for t in range (len(p1)):
    data1 = data[p[t]:p2[t]]
    ax1.plot(data1)


 
最初から説明していくと、はじめに空のグラフを用意するスクリプトを用意します。そしてデータを区切るタイミングのデータ(p1,p2)を用意します(今回は入力したデータ:dataの極大ピークと極小ピークで区切る例)。その上で区切るピーク分のループ回路を用意して、ループ内でデータを切り出して、ループ内でグラフを書きます。

このループ回路では、グラフは一つですが、サブプロットの数を増やしたりすると同一ループ内で複数データを重ね書きすることができます。

ループ回路を使うことでかなりめんどくさいグラフ描写も比較的短いコードで書くことができます。ただmatplotlibもループ回路もちょっと重たいので、データ数が多い場合には処理に時間がかかることがあるのは留意しなければなりません。

後はfigureのサイズを変更したり、サブプロットの数などを調整したり、軸の目盛りの範囲を調整することでよりきれいなグラフ描写を行うことができます。

matplotlibの個人的な使用感としては、matlabのグラフ描写の方法とかなり似ているので、かなり良い感じです。特に古いmatlabだと互換がなかったりうまく描写できないことも出てくるようになっているので、古いmatlabを使ってうまくグラフ描写ができないので悩んでいるのであれば、pythonのmatplotlibに移行するのがおすすめです。

また逆にデータの行数をそろえてしまえば、こういった処理を行わなくてもよくなるので、データのサンプルサイズを調整するといった方法も視野にいれるとよいでしょう。