PythonのMatplotlibを使って、実験データ(波形)を折れ線グラフとして出力、クリックして任意のプロット部分をマーキング、マーキング部分の座標を取得。というような実験データの解析補助ツールを作りました。これまでエクセルで頑張って読み取っていたので、正確かつ確実にデータを読み取れるようになりました。
ツールに搭載したい機能
- 任意のデータファイルを選択する
- 折れ線グラフとして表示する
- クリックして任意の座標のマーキング
- マーキングした部分の座標の読み取り
- 左クリックと右クリックの打ち分け
ツール開発をしたい理由
現在、研究で得られたデータを解析ためにエクセルでグラフ化 → 頂点の座標を読むということを行なっています。
しかし、如何せん効率がよくない、読み取った座標を記して残すことができない。ノイズがあるため、関数を利用して頂点の取得をしても、一つのピークから2点以上取得してしまう。
といった問題を抱えていてなかなか不便な状態でした。
これを打開するべく、Pythonを勉強し始めたといっても過言ではないです。
その他のソフトでは有料であったり、Pythonだと他にもいろいろ自由に応用できたり、プログラミングの勉強になるのではと素人考えで始めたのという理由もあります。
環境
- OS:Mac
- 使用環境:Python3.7、VS Code
- 使用ライブラリ:numpy、pandas、matplotlib、tkinter
実際に書いたコード
import matplotlib matplotlib.use('Qt4Agg') import numpy as np import pandas as pd import matplotlib.pyplot as plt from tkinter import filedialog typ = [('CSVファイル', '*.csv')] dir = '/Users/◯◯/△△/' #任意のファイルを指定 file = filedialog.askopenfilename(filetypes = typ, initialdir = dir) data = pd.read_csv(file) x = data['time'] y = data['speed'] #グラフの描画 fig, ax = plt.subplots() ax.plot(x, y) ax.set_title('グラフクリック') #クリックで座標に印をつける def oncpaint(event): if event.button==3: ind = np.searchsorted(x,event.xdata) plt.title("You clicked index="+str(ind)) ax.plot([x[ind]],[y[ind]], ".", color="red") fig.canvas.draw() print('x=%f, y=%f' %(x[ind], y[ind])) cid = fig.canvas.mpl_connect('button_press_event', oncpaint) plt.show()
このツールの使用方法
データの準備
今回は、得られるデータが横軸が時間(time)縦軸が速度の変化(speed)になるので、サンプルとして下記のようなCSV形式のファイルを用意します。
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/7ac1afd5e55769bff074e0fcdac694ef-1024x897.jpeg)
任意のデータファイルの選択
まず始めにプログラムを開始したら、ボックスが表示されて、ここから任意のCSVファイルを選択します。
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/795316b92fc766b0181f6fef074f03fa-1024x574.jpeg)
折れ線グラフの表示
この折れ線グラフはMatplotlibの拡大ツールを使うことによって、ピーク部分を拡大することができます。
データ量が多くなってグラフが細かくなっても安心です。
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/f2f06dbc2b749578fcfd653f4694e35b-1024x391.jpeg)
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/7150ee454d43d5c9f2d99fa9673271b6-1024x391.jpeg)
クリックで座標のマーキングおよび、読み取り
今回は、拡大機能を搭載するに当たって、左クリックを使用するので、右クリックした部分をマーキングに割り当てました。
正確にはグラフ上の座標ではなく、グラフ上にプロットした折れ線のプロットのある部分(クリックした直後の右のプロット)の座標を取得するようにしています。でないとデータではない座標を取得してしまうので。
クリックすると、任意のプロットした座標が赤印でマーキングされます。
そしてマーキングされた部分の座標がターミナルに自動で表示されていきます。
私は、ターミナルに出力された座標を再度エクセルにコピペして、最終的にエクセル上で取得したピークについての解析を行なっています。
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/76db0aa18964b5b4ad4cbc61c03a550c-1024x391.jpeg)
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/8b62f881eb9533af850524400e2e850e-1024x391.jpeg)
![](https://kagakunomemocho.com/wp-content/uploads/2019/06/d023d6bb344368e5586994eb5598a089-1024x210.jpeg)
Pythonを学び始めた目標をとりあえず形にすることができた
ということで上記のプログラムで、当初の目的であった頂点の解析補助ツールの作成を行うことができました。
これでまず一つの目的を達成できました。感無量です。
今後取り組みたいこと
改良するべき欠点
今回作成したものは、頂点のマーキングと座標の取得が同時に行われるので、クリックするポイントをミスすると、目的でない座標が混入するということが、地味かつ最大の欠点です。
ここをマーキング(間違えた部分の取り消し可能)をしてから、座標を取得するというように改良できれば、とっても使いやすくなるのではないかと企んでいます。
また、現在解析がエクセルとPythonをいったりきたりしているので、その間をもう少しスムーズにできるようになったら良いなと考えています。
統計解析について
Pythonでも統計解析を行うことができるそうですね。
統計解析は研究を行う上では非常に重要なのですが、私自身そこまで自信を持って統計ができますとは言えないので、Pythonで統計解析をする方法を学びながら、統計についても勉強していけたらと考えています。
すでにこちらの本を購入して、勉強中です。
Pythonで理解する統計解析の基礎、谷合 廣紀(著)、辻 真吾(監修)、技術評論社
遊びたい
安直な素人思考過ぎますが、やはりプログラミングと言えば、何か色々作れる!という認識を持っているので、やはり作ってみたいところですね。
実は本格的にPythonを始める前にPythonista3というiOS版のPythonのアプリを購入していじっていたのですが、そこで、電卓やブロック崩しなどができるということがわかっているので、それを参考に作っていきます。
学びは遊びからが私のモットーなので、遊びながら学んでいきます。
参考にさせてもらったページ
・python/matplotlibの図上にてクリックで座標値を取得したりキーボード入力値を取得したりする
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9cHl0aG9uJTJGbWF0cGxvdGxpYiVFMyU4MSVBRSVFNSU5QiVCMyVFNCVCOCU4QSVFMyU4MSVBQiVFMyU4MSVBNiVFMyU4MiVBRiVFMyU4MyVBQSVFMyU4MyU4MyVFMyU4MiVBRiVFMyU4MSVBNyVFNSVCQSVBNyVFNiVBOCU5OSVFNSU4MCVBNCVFMyU4MiU5MiVFNSU4RiU5NiVFNSVCRSU5NyVFMyU4MSU5NyVFMyU4MSU5RiVFMyU4MiU4QSVFMyU4MiVBRCVFMyU4MyVCQyVFMyU4MyU5QyVFMyU4MyVCQyVFMyU4MyU4OSVFNSU4NSVBNSVFNSU4QSU5QiVFNSU4MCVBNCVFMyU4MiU5MiVFNSU4RiU5NiVFNSVCRSU5NyVFMyU4MSU5NyVFMyU4MSU5RiVFMyU4MiU4QSVFMyU4MSU5OSVFMyU4MiU4QiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9YTdmYTQzZDUzNzI3MDM0NTk5OTFkYWNiMGZmNjE5YTM&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBIYWppbWVLYXdhaGFyYSZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9MmU4N2NiOTY1NTgwMTg3MWJhZWU2NjRkMDVmN2VhYzY&blend-x=142&blend-y=486&blend-mode=normal&s=15b29c13f2f5dafb8b7f4dcd300d8b07)
・matplotlibで描いたグラフ上の座標を取得する方法
![](https://cdn-ak.f.st-hatena.com/images/fotolife/M/Megumi221/20111212/20111212210800.jpg)
この場を借りてお礼申し上げます。
コメント