見出し画像

Google ColaboratoryでPythonを始める-16/Altairで動的グラフの作成-3/(時系列データの表示)

こんにちはロック204チャンネルです。
今回は「Google ColaboratoryでPythonを始める 16
Altairで動的グラフの作成 3」をお送りします。

今回使用するのは筋電図のエクセルデータです。
このデータとコードは、noteのページで公開していますのでダウンロードして使用してみてください。


Google Colaboratoryでこのデータを取り込むプログラムをここに示します。
詳しい内容については、以前説明していますので今回は省略します。
このコードもnoteで公開していますのでダウンロードして使用してください。
こちらは取り込みプログラムの前半になります。

こちらのコードは取り組みプログラムの後半にあたります。
データは取り込んだら列名を設定し、データ変換・基線の設定を行ないます。
そして、これらの処理が行われた結果がスライド右側の表となっています。
今回使用するのは0列目の「sec」、秒で時間軸に使用します。
次に「EMG1」、これが筋電図の波形となります。
「iEMG1」は積分値となっています。
これらを使ってaltairでグラフ表示して行きます。

# data load
 #Exccelデータを取り込む import pandas as pd
import numpy as np
file_name=input("ファイル名を入れてください(例 「data.xlsx」拡張子を除く「data」)=")
address='/content/'+file_name+'.xlsx' 
print("input file=",address)
print("エラーが出た場合はもう一度実行ボタンを押し、このセッションをやり直してください。")
#----read paramater------------------
df0=pd.read_excel(address,nrows=9) #nrowsは上から何行目まで読み取るか
print("計測時ID=",df0.iat[0,1]) #df.iat[位置を表す行番号, 位置を表す列番号]
print("計測開始時刻=",df0.iat[1,1])
print("サンプリング周波数=",df0.iat[2,1])
print("シーケンス番号=",df0.iat[3,1])
print("コメント=",df0.iat[6,1]+","+df0.iat[6,2]+","+df0.iat[6,3])

Client_ID=df0.iat[0,1]
Date_ID=df0.iat[1,1]
Time_=df0.iat[5,1]
Sanpling=df0.iat[2,1]
Comment=df0.iat[6,1]+","+df0.iat[6,2]+","+df0.iat[6,3]
#----------read data to df-------------------
df=pd.read_excel(address,skiprows=9)
EMG_data=df.iloc[:,[0,1,2]].astype(float)
EMG_data.columns=["sec","EMG1","iEMG1"]
#データ変換と基線設定
EMG_data['sec']=EMG_data['sec']/1000 #秒に変換
EMG_data['EMG1']=EMG_data['EMG1']*2 #mVに変換
EMG_mean=EMG_data['EMG1'].mean()
EMG_data.loc[:,'EMG1']-=EMG_mean
EMG_data

筋電図データの取り込み-3

そして10行移行がchartのパラメーターをする部分になります。
最初に12行で使用するデータとして「EMG_data」を設定します。
13行ではグラフを折れ線とするため「.mark_line()」を使用します。
15行では、x軸を「sec」列とし
16行でデータtypeを「quantitative」(連続量)として設定します。
17行のscaleでX軸の表示範囲を[最小値、最大値]として設定しますが、最大値は10行の式で計算しておきます。

こちらにプログラムの後半を示します。
y軸には「EMG1」のフィールドを設定し
こちらもデータtypeとして「quantitative」を設定します。
そして28行でグラフの大きさとタイトルを設定します。
またコメントアウトされた部分の
interactiveを有効にすればグラフの動的機能を追加することができます。


#源波形を表示
import altair as alt
# 入力レコードの上限の変更(データ個数の上限を10000に設定)
from altair import limit_rows, to_values
import toolz
t = lambda data: toolz.curried.pipe(data, limit_rows(max_rows=10000), to_values)
alt.data_transformers.register("custom", t)
alt.data_transformers.enable("custom")

sec_max=EMG_data['sec'].max() #測定時間の最大値を求める
(
    alt.Chart(EMG_data)
    .mark_line()
    .encode(
        x=alt.X("sec",
        type="quantitative",
        scale=alt.Scale(domain=[0,sec_max])
        ),

        y=alt.Y("EMG1",
        type="quantitative"
      ),
         #マウスの位置のデータを表示する         tooltip=[
            alt.Tooltip(field="sec",format='.3'),
            alt.Tooltip(field="EMG1",format='.3'),
        ]
    ).properties(width=600, height=300,title="EMG源波形 "+str(Client_ID)).interactive()
)

連続変量データのグラフ表示-3

次に二系列のデータを表示する方法について説明します。
最初に①の赤枠の中は、系列1と系列2にの共通部分であるx軸を設定して行きます。
x軸に「sec」の項目に設定し、タイトルとして”sec”に設定します。
そしてマウスオーバーしたときの記述も、8行から12行にかけて書いていきます。
13行では、図の縦横の大きさ、グラフタイトルを入れます。
②の赤枠は系列1のy軸の設定を行ないます。
15行では、①のbaseで設定した折れ線グラフの色を「blue」として追加します。
16行では、用いるデータを「EMG1」として設定します。

こちらが後半のコードとなります。
20行から25行にかけて2系列目のラインにを設定します。
表示色を「red」として、y軸データは「iEMG1」を用い、タイトルは「iEMG1(red)」とします。
②の赤枠は、系列1のline1と系列2のline2を重ね表示したものを「chart」として定義しています。
③の赤枠では、chartをインターアクティブ表示する命令を追加しています。
それでは実行状況を見て行きましょう。

 #2系列のデータを表示する 
import pandas as pd
import altair as alt

base = alt.Chart(EMG_data).encode(
    alt.X('sec', axis=alt.Axis(title="sec")),
        #マウスの位置のデータを表示する 
        tooltip=[
            alt.Tooltip(field="sec",format='.3'),
            alt.Tooltip(field="EMG1",format='.3'),
            alt.Tooltip(field="iEMG1",format='.3')
        ]
    ).properties(width=600, height=300,title='2系列表示')

line1 = base.mark_line(color='blue').encode(
    alt.Y('EMG1', 
          axis=alt.Axis(title='EMG1(blue)')
          )
    )
line2 = base.mark_line(color='red').encode(
    alt.Y('iEMG1',
         axis=alt.Axis(title='iEMG1(red)')
         )
    )
chart = alt.layer(line1, line2)

chart.interactive()

2系列のデータを表示-3


この記事が気に入ったらサポートをしてみませんか?