PythonによるDelsys筋電CSVデータの可視化:詳細解説
本記事では、Delsysシステムで取得した筋電図(EMG)のCSVデータをPythonを用いて可視化する方法について詳細に解説します。
筋電図は筋肉が発する電気信号であり、リハビリテーション、スポーツ科学、疲労評価、義手制御などの分野で幅広く利用されています。
Delsysは高品質なEMGセンサを提供しているメーカーであり、多くの研究機関や医療機関で採用されています。
本記事では、実際にDelsysで取得したデータを例に、Pythonと各種ライブラリ(pandas
、matplotlib
、tkinter
など)を使ってデータを読み込み、グラフ化する手順を示します。
1. 全体の流れ
- ファイル選択:ユーザがGUIを通して、プロットしたいCSVファイルを選択します。
- CSVファイルの読み込み:
pandas
ライブラリを使って、必要な列(タイムスタンプやEMG信号)だけを読み込みます。 - 変数への格納:CSVから読み込んだデータを、Pythonの変数(
time
やEMG1
など)に格納します。 - グラフ描画:
matplotlib
ライブラリでラインプロット(折れ線グラフ)を作成し、表示します。
上記の流れに沿って、コードを読み解いていきましょう。まずは、今回紹介するコードを全文提示します。
2. コード全文
# モジュールのインポート
import os
import tkinter
import tkinter.filedialog
import tkinter.messagebox
# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()
# csvファイル選択
fTyp = [("","*.csv")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('read_file_csv.py','対象ファイルを選択してください!')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
# data出力
import pandas as pd
df = pd.read_csv(file, header=0, usecols=['X[s]','EMG1: EMG 1','EMG2: EMG 2','EMG3: EMG 3','EMG4: EMG 4','EMG5: EMG 5','EMG6: EMG 6','EMG7: EMG 7','EMG8: EMG 8','Trigger: Analog.A 16'])
time = df['X[s]']
EMG1 = df['EMG2: EMG 2']
import matplotlib.pyplot as plt
# generate data
x = time
y = EMG1
fig = plt.figure()
mng = plt.get_current_fig_manager()
mng.window.state('zoomed')
mng.resize(2000, 900)
plt.plot(x, y)
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 10
plt.tight_layout()
plt.grid(True)
plt.title('EMG')
plt.xlabel('time[sec]')
plt.ylabel('amplitude')
plt.show()
3. コードのセクション別解説
以下の表では、上記コードをセクションごとに区切り、どのような役割を持つかを簡単にまとめました。
行・セクション | 処理内容 | 詳細 |
---|---|---|
1-3 | 必要なモジュールのインポート | os 、tkinter 、pandas 、matplotlib などを読み込む。 |
5-10 | ファイル選択ダイアログの作成 | tkinter でGUIのファイル選択ダイアログを生成。root.withdraw() で余計なウィンドウを表示しないようにする。 |
11-14 | CSVファイル選択 | fTyp は選択可能なファイル形式。iDir は現在のディレクトリを初期ディレクトリに設定。askopenfilename でファイルパスを取得。 |
17 | pandasのインポート | import pandas as pd でデータ解析に便利なpandasを読み込む。 |
19-21 | CSVファイル読み込み | pd.read_csv() を用い、header=0 (最初の行をヘッダとして読み込む)やusecols=[...] を指定し、必要な列だけを抽出。 |
22-23 | データを変数に格納 | time に時間データ、EMG1 にEMG2の列を格納。 |
25 | matplotlibのインポート | matplotlib.pyplot をplt という短い名前で呼び出す。 |
28-29 | 変数に代入 | x とy という名前の変数に、それぞれtime 、EMG1 を代入し、後でプロットに使用。 |
31-33 | グラフ描画設定1 | plt.figure() で新しい図(Figure)オブジェクトを作成。mng = plt.get_current_fig_manager() でウィンドウマネージャを取得。mng.window.state('zoomed') でウィンドウを全画面化。 |
34 | ウィンドウサイズ変更 | mng.resize(2000, 900) でウィンドウサイズを指定。 |
35-36 | プロット処理 | plt.plot(x, y) で折れ線グラフを描画。 |
37-38 | フォント設定 | plt.rcParams['font.family'] = 'Times New Roman' やplt.rcParams['font.size'] でフォントやフォントサイズを設定。 |
39-40 | レイアウト調整とグリッド設定 | plt.tight_layout() でグラフ周辺の余白を調整。plt.grid(True) で目盛り線を表示。 |
41-44 | グラフのタイトル・軸ラベル設定 | plt.title('EMG') でタイトル。plt.xlabel('time[sec]') 、plt.ylabel('amplitude') で軸ラベル。 |
46 | グラフ表示 | plt.show() でグラフウィンドウを表示。 |
4. CSVファイルの想定カラム構成
今回のDelsysのCSVファイルには、以下のような列名が含まれていると想定しています。実際の測定条件やソフトウェアバージョンによって多少変わることもありますが、基本的には以下の列が含まれています。
列名 | 説明 |
---|---|
X[s] | サンプリングされた時間(秒)。横軸(time )として使用。 |
EMG1: EMG 1 | チャンネル1のEMG測定値。アナログ出力を含む場合あり。 |
EMG2: EMG 2 | チャンネル2のEMG測定値。本コードでグラフ化の例 |
EMG3: EMG 3 | チャンネル3のEMG測定値。 |
EMG4: EMG 4 | チャンネル4のEMG測定値。 |
EMG5: EMG 5 | チャンネル5のEMG測定値。 |
EMG6: EMG 6 | チャンネル6のEMG測定値。 |
EMG7: EMG 7 | チャンネル7のEMG測定値。 |
EMG8: EMG 8 | チャンネル8のEMG測定値。 |
Trigger: Analog.A 16 | トリガー信号(外部同期などに使われる)。 |
5. ライブラリの役割
本プロジェクトで使われているPythonライブラリ・モジュールは下記の通りです。
ライブラリ名 | 主な役割 |
---|---|
os | ファイルパスの操作(os.path.abspath やos.path.dirname など)に利用 |
tkinter | GUIウィンドウの作成、tkinter.filedialog などを用いたファイル選択ダイアログ |
pandas | CSVファイルの読み込み、データフレーム操作 |
matplotlib | グラフ描画ライブラリ。プロットや軸ラベル、目盛り線などの設定が可能 |
6. 実行方法
本コードを実行するために必要な手順をまとめます。
- Pythonとライブラリのインストール
- Python 3.x をインストール。(公式サイト)
- 以下のコマンドでライブラリをインストール:
pip install pandas pip install matplotlib
Windowsの環境によっては、
py -m pip install
やpython -m pip install
の形式になる場合もあります。
- CSVファイルを用意
Delsysシステムから出力されたCSVファイルを同じフォルダにおいてもよいですし、別のフォルダでもかまいません。 - コードを保存
上記のPythonコードを例として、plot_emg.py
などの名前で保存します。(ファイル名は任意) - コードの実行
ターミナルやコマンドプロンプト上で:python plot_emg.py
実行後、GUIダイアログが表示されるので、目的のCSVファイルを選択します。
- グラフの表示
選択したCSVに含まれるEMG2: EMG 2
列のデータが時系列で描画され、グラフウィンドウが表示されます。
7. サンプルデータの可視化例
ここでは、簡単なサンプルとして、先頭数行が以下のようなCSVデータを想定してみます。
X[s] | EMG1: EMG 1 | EMG2: EMG 2 | EMG3: EMG 3 | …(以下省略) |
---|---|---|---|---|
0.0000 | -0.0021 | 0.0015 | -0.0020 | … |
0.0005 | 0.0008 | 0.0022 | -0.0015 | … |
0.0010 | 0.0012 | 0.0031 | 0.0002 | … |
…省略… | …省略… | …省略… | …省略… | … |
このように、X[s]
が時間(秒)として格納され、各EMGチャンネルの列がそれぞれ筋電の電圧値(あるいはデータロガーの値)を示します。実際の測定では数千〜数万行にも及ぶデータになることが多いです。
8. グラフのカスタマイズ
matplotlib
には多くのカスタマイズオプションがあります。本記事のコード例でも簡単に示しましたが、さらに以下のような変更や追加ができます。
- 色や線のスタイル変更
例:plt.plot(x, y, linestyle='--', linewidth=2)
など。 - 複数系列の描画
例:同じグラフ内にEMG1
とEMG2
を重ねて表示し、plt.plot(x, EMG1, label='EMG1')
、plt.plot(x, EMG2, label='EMG2')
とし、plt.legend()
で凡例を追加。 - 周波数解析
EMGデータを周波数ドメインで解析する場合は、numpy
やscipy
を使って高速フーリエ変換(FFT)を行い、スペクトルを可視化する方法などがあります。 - フィルタリング
筋電信号を扱う際、ノイズ除去や帯域フィルタなどがしばしば必要です。scipy.signal
を用いたIIRフィルタやFIRフィルタの実装などが考えられます。
9. データ解釈における注意
筋電図データは、生体信号の中でも比較的ノイズが多く、取り扱いが難しい部類に入ります。
解析や可視化を行う上で、以下の点には特に注意が必要です。
- 電極装着部位:どの筋肉に対してどのように電極を装着したかによって信号の振幅や形状が大きく異なります。
- サンプリング周波数:EMGの周波数帯域に見合ったサンプリングレートを確保する必要があります。(通常、1kHz〜2kHz以上が推奨)
- 基線ドリフト・動作アーチファクト:被験者の動きや電極のズレなどが原因となり、ベースラインがずれることがあります。フィルタリングやアーチファクト除去手法を検討してください。
- 同期信号:他のセンサ(運動計測用IMUなど)や外部デバイスとの同期をとる場合は、トリガー信号列(
Trigger: Analog.A 16
など)をうまく活用するとよいでしょう。
10. まとめ
本記事では、Delsysから出力されたEMG CSVデータをPythonで読み込み、グラフ化する方法を詳細に解説しました。今回のポイントをまとめると、以下の通りです。
- GUIによるCSVファイル選択:
tkinter
を使ってユーザーフレンドリーに。 - pandasによるCSV読み込み: 必要な列だけを
usecols
オプションで指定すると効率的。 - matplotlibによるプロット: 縦軸に筋電の振幅、横軸に時間を取り、グラフ化して可視化。
- カスタマイズ性: フォント、グリッド、プロットスタイルなどの変更が可能。
筋電図データは、計測から可視化・解析まで考慮すべき点が多岐にわたります。しかし、Python環境を整えれば、あらゆる種類の生体信号やセンサデータの処理に柔軟に対応できます。
ぜひ本記事のコードを参考に、ご自身の研究や開発に役立てていただければ幸いです。
最後までお読みいただき、ありがとうございました。これで、Delsys筋電のCSVデータをPythonで可視化するまでの一連の流れをマスターしていただけたと思います。より高度な解析(例えばスペクトル解析、ウェーブレット変換、機械学習によるパターン認識など)にも挑戦してみましょう!
コメント