EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

CSVファイルのデータを手軽にグラフ化するGUIツールを作ってみた

Python実践データ分析100本ノック

Python実践データ分析100本ノック

目次

背景・目的

何かしらのデータを取得し解析する時は、まずCSVファイルに保存して、
それをPythonなりMATLABなりで読み込んでグラフ化する、というやり方を
よくやります。
ただし、解析するたびにそのためのコードを書くのも面倒くさいので、
どんな内容のCSVファイルでも同じ処理でグラフ化出来る方法がないかと
調べていたところ、こちらのような可視化ツールを作っている人達がいる
のを見つけました。

www.plotjuggler.io

github.com

いずれもシンプルなファイル選択やクリック操作で自由にグラフを作れるのが
とても好印象だったので、感化されて自分でも作ってみる事にしました。
今回は、Pythonでいろいろ機能を追加して作ったGUIツール、CsvDataAnalyzerを
紹介します。

f:id:sy4310:20200125231212p:plain

ソースコード

CsvDataAnalyzerのソースコードはこちらのGitHubリポジトリで管理しています。

github.com

使い方

インストールと起動

上記のリポジトリの自分のローカルにクローンし、こちらのコマンドを実行します。

f:id:sy4310:20200125141339p:plain

そして少し待つと、このようにGUIが出てきます。これで起動完了です。

f:id:sy4310:20200125150235p:plain

PythonでGUI作ると起動が遅い。。こんなもんなのかな?
これから改善していきたいところ。

CSVファイルの読み込み

左上の'File'メニューから'Read csv file'を選びます。

f:id:sy4310:20200125151057p:plain

CSVファイルを選択するダイアログが開きます。

f:id:sy4310:20200125151249p:plain

ファイルを選択し開くと、GUIがこちらのようになります。
これで読み込み完了です。

f:id:sy4310:20200125155604p:plain

また、このように複数のCSVファイルをまとめて選択して、
一つのデータとして統合して読み込む事も出来ます。ただし、
各ファイルのデータ項目が完全に一致している場合のみに
有効です。

f:id:sy4310:20200126114839p:plain

各データの最大値、最小値、平均値、標準偏差の計算

読み込んだ各列のデータにおいて、最大値、最小値、平均値、
標準偏差を自動計算して表示します。

f:id:sy4310:20200125155954p:plain

この表示欄の一番左の列から順に、ファイル名、データ名、
最大値、最小値、平均値、標準偏差を表示しています。この欄は、
一番右のスクロールバーで上下にスクロール可能です。

グラフの作り方と種類

このツールでは下記の種類のグラフを作成できます。

  • 2/3次元の線グラフ
  • 2/3次元の散布図
  • 1次元のヒストグラム

各種グラフ作成時の共通手順として、まずデータを選択します。
前述した表示欄上で、グラフ化したいデータの行を左クリックします。
すると、GUI上ではこのようになります。

f:id:sy4310:20200125161121p:plain

青くハイライトしているのが、選択されているデータです。
そして、この状態で左端の各軸のSetボタンを押します。

f:id:sy4310:20200125161729p:plain

これらのボタンを押す事で、選択したデータをグラフのX, Y, Z軸に
それぞれ割り当てる事が出来ます。ちなみに一番下のCとは、散布図で
ヒートマップを作る際の色分けに使うデータをセットするものです。
Setボタンを押すと、その右にある空欄がこちらのようになります。

f:id:sy4310:20200125165934p:plain

これでデータのセットは完了したので、次にグラフ化する際の色を
設定します。左側中段にあるこちらのプルダウンメニューから好きな
色を選択します。

f:id:sy4310:20200125171322p:plain

ここまでが共通手順です。
ここから先は、各種グラフの作成手順について述べていきます。

2次元の線グラフ

  • CSVファイルを読み込む
  • X軸用のデータをセットする
  • Y軸用のデータをセットする
  • グラフの色を設定する(例として青)

ここまででこういう状態
f:id:sy4310:20200125215626p:plain

  • 左上の'Figures'メニューから'Create 2D Line'を選ぶ

f:id:sy4310:20200125215951p:plain

  • 空のグラフが表示される

f:id:sy4310:20200125220257p:plain

  • グラフ上にマウスカーソルを持っていき右クリックする
  • 線グラフが表示される

f:id:sy4310:20200125220802p:plain

  • 別のデータを重ねて描きたい場合は、別のデータを選択+別の色をセットする
  • 再度グラフ上で右クリックすると、先に作ったグラフに重ね描きされる

f:id:sy4310:20200125221059p:plain

  • 'Figure'メニューから選択する工程を再度行えば、同時に複数のグラフを作れる

f:id:sy4310:20200125221430p:plain

  • 両軸のデータ単位を合わせたい場合は、左下の'Axis Equal'メニューから'ON'を選ぶ
  • そこから再度グラフを作ればOK

f:id:sy4310:20200125222123p:plain

3次元の線グラフ

  • CSVファイルを読み込む
  • X軸用のデータをセットする
  • Y軸用のデータをセットする
  • Z軸用のデータをセットする
  • グラフの色を設定する(例として青)

ここまででこういう状態
f:id:sy4310:20200125222442p:plain

  • 左上の'Figures'メニューから'Create 3D Line'を選ぶ
  • 空のグラフが表示される

f:id:sy4310:20200125222650p:plain

  • 前述したようにグラフ上で右クリックすればOK

f:id:sy4310:20200125222756p:plain

  • 前述した2Dの線グラフと同時に表示する事もできます

f:id:sy4310:20200125222921p:plain

2次元の散布図

  • CSVファイルを読み込む
  • X軸用のデータをセットする
  • Y軸用のデータをセットする
  • グラフの色を設定する(例として青)
  • 左上の'Figures'メニューから'Create 2D Scatter'を選ぶ
  • 空のグラフが表示される
  • グラフ上で右クリックしてグラフ作成

f:id:sy4310:20200125223936p:plain

  • ヒートマップにする場合は、'C'に色分け用データをセットする

f:id:sy4310:20200125224443p:plain

  • 再度グラフを作成すればこの通り

f:id:sy4310:20200125224236p:plain

  • 色分けの範囲を変更するには、このように最大値と最小値を設定する

f:id:sy4310:20200125224707p:plain

  • 先に作ったヒートマップと比べるとこの通り

f:id:sy4310:20200125224820p:plain

3次元の散布図

  • CSVファイルを読み込む
  • X軸用のデータをセットする
  • Y軸用のデータをセットする
  • Z軸用のデータをセットする
  • グラフの色を設定する(例として青)
  • 左上の'Figures'メニューから'Create 3D Scatter'を選ぶ
  • 空のグラフが表示される
  • グラフ上で右クリックしてグラフ作成

f:id:sy4310:20200125225710p:plain

  • ヒートマップもこの通り

f:id:sy4310:20200125225817p:plain

1次元のヒストグラム

  • CSVファイルを読み込む
  • X軸用のデータをセットする
  • グラフの色を設定する(例として青)
  • 左上の'Figures'メニューから'Create Histgram'を選ぶ
  • 空のグラフが表示される
  • グラフ上で右クリックしてグラフ作成

f:id:sy4310:20200125230159p:plain

  • カーネル密度推定による分布も表示できます
  • 左下の'Hist KDE'メニューから'ON'選んで作成すればOK

f:id:sy4310:20200125230759p:plain

  • KDEについてはこちらを参照ください。

ja.wikipedia.org

今後

グラフの種類は限定的ですが、どれもよく作りたくなるものなので、
手元のデータをとりあえずさっと可視化したい時には便利なツールに
なっていると思います。
あとは、時系列に記録されたデータを可視化する時に、それを
アニメーション再生できる機能とかを入れたら、もっと面白く
出来そうなのでやりたいですね。