Pythonで電圧・電流の時系列CSVからグラフを作成する

matplotlibを使うとPythonで左右に軸を割り当てた2軸のグラフを簡単に描くことが出来る。今回は、Pythonを使ってCSVファイルに記録された電圧と電流の時系列データを2軸グラフにプロットする方法をまとめる。

スポンサーリンク

CSVファイルの読み込みにはpandasを使う

PythonでCSVファイルを読み込む方法は各種あるが、pandasを使うととても簡単。以下のわずか2行のコードを実行すれば、変数datにファイル名がfnameのCSVファイルの内容が全て読み込まれる。

import pandas as pd
dat = pd.read_csv(fname, header=None)

ヘッダ行があるCSVファイルの場合は、引数”header=None”を省略する。CSVファイルには以下の表のように、先頭列に経過時刻、2列目に電圧、3列目に電流が記録されている想定。

経過時間(秒)電圧(V)電流(mA)
1010.88714.83
2010.89714.63
3010.90714.73
4010.91714.83
:::

2軸グラフの作成にはtwinxメソッドを使う

matplotlibのAxesクラスに定義されているtwinxメソッドを使えば2軸グラフが描ける。twinxメソッドのヘルプページに幾つか例が挙げられている。

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.twinx.html

やりたいのは左右にそれぞれ電圧と電流の軸を置いたプロットをする事。これに近い例は”Plots with different scales”なので、下記リンクのページにあるコード例を参考にプログラムを作成した。

https://matplotlib.org/stable/gallery/subplots_axes_and_figures/two_scales.html#sphx-glr-gallery-subplots-axes-and-figures-two-scales-py

電圧・電流グラフ作成用Pythonコード

作成したコードは以下の通り。コメントで「グラフのプロット」と書いた所以降で実際にグラフの描画を行っており、ほぼ上記のヘルプページに載っているサンプルコードのコピペ。

#!/usr/bin/python3
import sys
import os

import matplotlib.pyplot as plt
import pandas as pd

def drawcsv(fname):
    if not os.path.exists(fname):
        raise Exception('File not found:' + fname)

    # CSVファイルの読み込み(ヘッダ行無しのデータ)
    dat = pd.read_csv(fname, header=None)

    # グラフのプロット
    fig, ax1 = plt.subplots()

    color = 'tab:blue'
    ax1.set_xlabel('Time(min.)')
    ax1.set_ylabel('Voltage(V)', color=color)
    ax1.plot(dat[0]/60, dat[1], color=color)
    ax1.tick_params(axis='y', labelcolor=color)

    ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

    color = 'tab:red'
    ax2.set_ylabel('Current(mA)', color=color)  # we already handled the x-label with ax1
    ax2.plot(dat[0]/60, dat[2], color=color)
    ax2.tick_params(axis='y', labelcolor=color)

    fig.tight_layout()  # otherwise the right y-label is slightly clipped
    ax1.set_ylim(10,12.5)
    plt.show()    

if __name__ == '__main__':
    if len(sys.argv)>1:
        drawcsv(sys.argv[1])

上記コード32行目で左側のy軸(電圧)の範囲指定をしているが、これは次に挙げる例に合わせた設定。本来はコマンドラインで指定出来たほうが良いんだろうけど、今後の課題ということで…

    ax1.set_ylim(10,12.5)

電圧・電流グラフの描画

グラフを描画するには、上記コードをLinuxコマンドラインからスクリプトとして起動出来るようにし、引数にCSVファイルを指定すればOK。

電圧・電流データの取得は、MicroPythonによる積算電流ロガーを使った。

ampyを使ってMicroPythonからPCにCSVファイルを転送し、そのCSVファイルをスクリプトに食わせれば、以下のようなグラフが描画出来る。

図

(↑ちなみにこれ、リチウムイオン電池の充電曲線です)

まとめ

データロガーで取得したデータをPCに取り込んで、Pythonでグラフ化する手順をまとめた。LinuxのコマンドラインからCSVファイルを指定するだけで手軽にグラフが作れるので、ESP32マイコンを使った電流ロガーで測定したデータの確認などに重宝しそうだ。

コメント

タイトルとURLをコピーしました