『データ視覚化のデザイン』に衝撃を受けた感動と自分用データ視覚化デザインについての記事を書きました!
『データ視覚化のデザイン』って何?という人は『Pythonで分かりやすいグラフを簡単に描く方法の紹介』の記事で紹介されているので読んでみてくださいな。
Contents
はじめに
実験データをエクセルでグラフ化する機会が多いのですが、野暮ったいグラフになるのが気になっていました。
最近では、Pythonを使う機会が増え、matplotlibを使うことでエクセルに比べイイ感じのグラフが書けて満足していたのですが、『データ視覚化のデザイン』という記事を見つけ、クールなグラフのデザインに衝撃を受けました。
データ視覚化デザインPythonモジュール『PyCoolPlot』
『データ視覚化のデザイン』の記事が公開されるとすぐに、データ視覚化デザインためのpythonモジュール『PyCoolPlot』がリリースされました!感謝!!
自分用データ視覚化デザインを考えてみる
さっそく『PyCoolPlot』を使って実験データをグラフ化したのですが、しっくりこない…私がよく扱う実験データがオシロスコープで計測するような折れ線のデータばかりなので、以下のポイントをデザインに取り入れたくなりました。
- 縦/横軸の単位は明記
- フォントは大きく
- やっぱりグリッドほしい
- 閾値など見るポイントを明記
上記のポイントとデータ視覚化デザイン両方を取り入れたイイ感じのPythonコードがないか探しましたが見つかりませんでした…
ないなら。。作るか!!工学部出身だし!!!!!
自分用データ視覚化デザインpythonコード『MyPlot』
自分用データ視覚化デザインpythonコード『MyPlot』は以下のフローで作成しました。
ネーミングセンスがなさ過ぎて『MyPlot』というダサい名前しか思いつかなかった。
- 普段のやり方で実験データをグラフ化
- 自分用データ視覚化デザインにカスタム
- カスタムにもう一工夫
以降で紹介するPythonコードは以下の環境でテストしています。
- Python3.6.5
- matplotlib2.2.2
- pandas0.23.0
- Jupyter Notebook
Anaconda5.2.0をインストールすれば全てデフォルトで使えます。
普段のやり方にで実験データをグラフ化
Pythonコードは以下の通り。(実験データはテキトーです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import pandas as pd import numpy as np import matplotlib import matplotlib.pyplot as plt values1 = [1, 3, 4, 8, 1, 5, 2, 2, 8, 5] # 実験データ1 values2 = [5, 2, 5, 1, 2, 4, 2, 1, 3, 4] # 実験データ2 # データフレーム生成 df = pd.DataFrame({'values1': values1, 'values2': values2}) # グラフ化 df.plot() |
できた図↓
よく見るコードによく見るグラフ…
凡例がグラフと被って全然クールじゃない…
自分用データ視覚化デザインにカスタム
自分用データ視覚化デザインにカスタムしたPythonコードは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
from matplotlib.ticker import MultipleLocator # 1. 色を原色のRGBとは違ういい感じの赤青緑に from cycler import cycler c = plt.get_cmap('Set1').colors plt.rcParams['axes.prop_cycle'] = cycler(color = c) fig, ax = plt.subplots(figsize = (7, 5)) # 2. 凡例を消す # 3. 線幅を太くする df.plot(ax = ax, linewidth = 3, legend = False) # 4. y軸ラベルを表示 # 5. x軸y軸の表示範囲を変更 x_min, x_max = 0, 9 y_min, y_max = 0, 10 ax.set(ylim = (y_min, y_max), xlim = (x_min, x_max + 0.03)) # 6. 文字サイズまとめて指定 plt.rcParams["font.size"] = 16 # 7. グラフのタイトル、X 軸、Y 軸の名前 (ラベル)、グリッド線を表示 plt.title("”Value2” keeps a low level (below 6) !!") plt.xlabel("Time[ms]") plt.ylabel("Volt[mV]") plt.grid(True) # 8. 右と上の枠を消す ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) # 9. 通常の凡例の代わりにプロットの右側にindexを表示 for i, name in enumerate(df.columns.values): ax.text(x_max + 0.03, ax.lines[i].get_data()[1][-1], name, color = f'C{i}', va = 'center') |
できた図↓
うん!グラフはかなりイイ感じ!ただ見るポイントが伝わらないので、もう一工夫!
カスタムにもう一工夫
今回は、「values2が閾値:6[mV]を超えないこと」が伝わるように10~12のコードを追加して、一工夫します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
from matplotlib.ticker import MultipleLocator # 1.~9. のコード # 10. 閾値の線を追加 th = 6 # plt.hlines(th, x_min, x_max + 0.1, "Magenta", linestyle = "--", lw = 1.5) plt.hlines(th, x_min, x_max + 0.1, "Orange", linestyle = "--", lw = 3) # 11. 矢印と吹き出し追加 from matplotlib.patches import Ellipse el = Ellipse((2, -1), 0.5, 0.5) # 3msの矢印 ps_x1, ps_y1 = 50, 40 pf_x1, pf_y1 = 3, 8 ax.annotate('Over 6', xy = (pf_x1, pf_y1), xycoords = 'data', xytext = (ps_x1, ps_y1), textcoords = 'offset points', size = 20, # bbox=dict(boxstyle="round", fc="6"), arrowprops = dict(arrowstyle = "fancy", fc = "0.6", ec = "none", patchB = el, connectionstyle = "angle3, angleA = 0, angleB = -90")) # 8msの矢印 ps_x2, ps_y2 = 50, 40 pf_x2, pf_y2 = 8, 8 ax.annotate('Over 6', xy = (pf_x2, pf_y2), xycoords = 'data', xytext = (ps_x2, ps_y2), textcoords = 'offset points', size = 20, # bbox=dict(boxstyle="round", fc="6"), arrowprops = dict(arrowstyle = "fancy", fc = "0.6", ec = "none", patchB = el, connectionstyle = "angle3, angleA = 0, angleB = -90")) # 12. 吹き出し ann = ax.annotate('”Value2” keeps a low level !! \n (below 6) ', xy = (9, 3.7), xycoords = 'data', xytext = (0, -60), textcoords = 'offset points', size = 20, bbox = dict(boxstyle = "round", fc = (1.0, 0.7, 0.7), ec = (1.0, 0.5, 0.5)), arrowprops = dict(arrowstyle = "wedge, tail_width = 1.", fc = (1.0, 0.7, 0.7), ec = (1.0, 0.5, 0.5), patchA = None, patchB = el, relpos = (0.2, 0.8), connectionstyle = "arc3, rad = -0.1")) |
できた図↓
うむ!すごくイイ感じです!!ただ、吹き出し位置の微調整が結構大変だったので、グラフ生成まではPythonでやらせて、矢印や吹き出しはあとからパワーポイントとかで追加するのがスマートかもしれません。今回は頑張ってPythonのみで完結させてみました!
まとめ
『データ視覚化デザイン』に衝撃を受け、創作意欲が掻き立てられ、『自分用データ視覚化デザイン』のPythonコードを作成しました。もし良ければ多くの人に使ってほしいなぁ…と思い人生初のブログまで始めました!(本記事が初投稿です)
拙い文章だったと思いますが、最後まで読んで頂けたら、とても嬉しいです(^^)
余談
最後のpythonコードだけ載せても良かったのですが、途中経過も載せることで、現役エンジニアの考え方が少しでも伝われば、学生さんなどを助けられるかなぁという裏の意図もあったり…
プロフィールにもあるように『理系応援ブロガー』として今後も記事を書こうと思います。ツイッターもやっているので興味ある方はフォローしてね↓