![見出し画像](https://assets.st-note.com/production/uploads/images/127904003/rectangle_large_type_2_6b9e8476663442b5fbcc8391d8feaaed.png?width=1200)
Google ColaboratoryでPythonを始める-16/Altairで動的グラフの作成-3/(時系列データの表示)
こんにちはロック204チャンネルです。
今回は「Google ColaboratoryでPythonを始める 16
Altairで動的グラフの作成 3」をお送りします。
今回使用するのは筋電図のエクセルデータです。
このデータとコードは、noteのページで公開していますのでダウンロードして使用してみてください。
![](https://assets.st-note.com/img/1705473278860-7WXKck0M0F.png?width=1200)
Google Colaboratoryでこのデータを取り込むプログラムをここに示します。
詳しい内容については、以前説明していますので今回は省略します。
このコードもnoteで公開していますのでダウンロードして使用してください。
こちらは取り込みプログラムの前半になります。
![](https://assets.st-note.com/img/1705473330316-yvBI894F7L.png?width=1200)
こちらのコードは取り組みプログラムの後半にあたります。
データは取り込んだら列名を設定し、データ変換・基線の設定を行ないます。
そして、これらの処理が行われた結果がスライド右側の表となっています。
今回使用するのは0列目の「sec」、秒で時間軸に使用します。
次に「EMG1」、これが筋電図の波形となります。
「iEMG1」は積分値となっています。
これらを使ってaltairでグラフ表示して行きます。
![](https://assets.st-note.com/img/1705473359825-LV7UcTUVDL.png?width=1200)
# 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行の式で計算しておきます。
![](https://assets.st-note.com/img/1705473487322-BsinKZJnI0.png?width=1200)
こちらにプログラムの後半を示します。
y軸には「EMG1」のフィールドを設定し
こちらもデータtypeとして「quantitative」を設定します。
そして28行でグラフの大きさとタイトルを設定します。
またコメントアウトされた部分の
interactiveを有効にすればグラフの動的機能を追加することができます。
![](https://assets.st-note.com/img/1705473520880-WTYgFJUwyf.png?width=1200)
#源波形を表示
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」として設定します。
![](https://assets.st-note.com/img/1705473660252-7W0s4KvOTq.png?width=1200)
こちらが後半のコードとなります。
20行から25行にかけて2系列目のラインにを設定します。
表示色を「red」として、y軸データは「iEMG1」を用い、タイトルは「iEMG1(red)」とします。
②の赤枠は、系列1のline1と系列2のline2を重ね表示したものを「chart」として定義しています。
③の赤枠では、chartをインターアクティブ表示する命令を追加しています。
それでは実行状況を見て行きましょう。
![](https://assets.st-note.com/img/1705473693234-IJypoWZrV9.png?width=1200)
#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
この記事が気に入ったらサポートをしてみませんか?