【2025年版】PythonによるDelsysの筋電図のCSVデータを可視化:リハビリ評価、コピペ可能

コード知識

 

PythonによるDelsys筋電CSVデータの可視化:詳細解説

本記事では、Delsysシステムで取得した筋電図(EMG)のCSVデータをPythonを用いて可視化する方法について詳細に解説します。
筋電図は筋肉が発する電気信号であり、リハビリテーション、スポーツ科学、疲労評価、義手制御などの分野で幅広く利用されています。
Delsysは高品質なEMGセンサを提供しているメーカーであり、多くの研究機関や医療機関で採用されています。
本記事では、実際にDelsysで取得したデータを例に、Pythonと各種ライブラリ(pandasmatplotlibtkinterなど)を使ってデータを読み込み、グラフ化する手順を示します。


1. 全体の流れ

  1. ファイル選択:ユーザがGUIを通して、プロットしたいCSVファイルを選択します。
  2. CSVファイルの読み込み:pandasライブラリを使って、必要な列(タイムスタンプやEMG信号)だけを読み込みます。
  3. 変数への格納:CSVから読み込んだデータを、Pythonの変数(timeEMG1など)に格納します。
  4. グラフ描画: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必要なモジュールのインポートostkinterpandasmatplotlibなどを読み込む。
5-10ファイル選択ダイアログの作成tkinterでGUIのファイル選択ダイアログを生成。
root.withdraw()で余計なウィンドウを表示しないようにする。
11-14CSVファイル選択fTypは選択可能なファイル形式。
iDirは現在のディレクトリを初期ディレクトリに設定。
askopenfilenameでファイルパスを取得。
17pandasのインポートimport pandas as pdでデータ解析に便利なpandasを読み込む。
19-21CSVファイル読み込みpd.read_csv()を用い、header=0(最初の行をヘッダとして読み込む)やusecols=[...]を指定し、必要な列だけを抽出。
22-23データを変数に格納timeに時間データ、EMG1にEMG2の列を格納。
25matplotlibのインポートmatplotlib.pyplotpltという短い名前で呼び出す。
28-29変数に代入xyという名前の変数に、それぞれtimeEMG1を代入し、後でプロットに使用。
31-33グラフ描画設定1plt.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.abspathos.path.dirnameなど)に利用
tkinterGUIウィンドウの作成、tkinter.filedialogなどを用いたファイル選択ダイアログ
pandasCSVファイルの読み込み、データフレーム操作
matplotlibグラフ描画ライブラリ。プロットや軸ラベル、目盛り線などの設定が可能

6. 実行方法

本コードを実行するために必要な手順をまとめます。

  1. Pythonとライブラリのインストール
    • Python 3.x をインストール。(公式サイト)
    • 以下のコマンドでライブラリをインストール:
      pip install pandas
      pip install matplotlib
      

      Windowsの環境によっては、py -m pip installpython -m pip installの形式になる場合もあります。

  2. CSVファイルを用意
    Delsysシステムから出力されたCSVファイルを同じフォルダにおいてもよいですし、別のフォルダでもかまいません。
  3. コードを保存
    上記のPythonコードを例として、plot_emg.pyなどの名前で保存します。(ファイル名は任意)
  4. コードの実行
    ターミナルやコマンドプロンプト上で:

    python plot_emg.py
    

    実行後、GUIダイアログが表示されるので、目的のCSVファイルを選択します。

  5. グラフの表示
    選択したCSVに含まれるEMG2: EMG 2列のデータが時系列で描画され、グラフウィンドウが表示されます。

7. サンプルデータの可視化例

ここでは、簡単なサンプルとして、先頭数行が以下のようなCSVデータを想定してみます。

X[s]EMG1: EMG 1EMG2: EMG 2EMG3: EMG 3…(以下省略)
0.0000-0.00210.0015-0.0020
0.00050.00080.0022-0.0015
0.00100.00120.00310.0002
…省略……省略……省略……省略…

このように、X[s]が時間(秒)として格納され、各EMGチャンネルの列がそれぞれ筋電の電圧値(あるいはデータロガーの値)を示します。実際の測定では数千〜数万行にも及ぶデータになることが多いです。


8. グラフのカスタマイズ

matplotlibには多くのカスタマイズオプションがあります。本記事のコード例でも簡単に示しましたが、さらに以下のような変更や追加ができます。

  • 色や線のスタイル変更
    例:plt.plot(x, y, linestyle='--', linewidth=2)など。
  • 複数系列の描画
    例:同じグラフ内にEMG1EMG2を重ねて表示し、plt.plot(x, EMG1, label='EMG1')plt.plot(x, EMG2, label='EMG2')とし、plt.legend()で凡例を追加。
  • 周波数解析
    EMGデータを周波数ドメインで解析する場合は、numpyscipyを使って高速フーリエ変換(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で可視化するまでの一連の流れをマスターしていただけたと思います。より高度な解析(例えばスペクトル解析、ウェーブレット変換、機械学習によるパターン認識など)にも挑戦してみましょう!

 

特集記事

コメント

この記事へのコメントはありません。

TOP