モチベーション
皆さん、タイミングチャートってどうやって作ってますか?
多くの方がExcelで作っているのではないかと思います。私もそうです。
(簡単に作れる便利なツールがあるなら教えて欲しい。)
扱っている製品の分野上、タイミングチャートを作成する機会は比較的多いのですが、正直、Excelで作成するのは面倒です。
(枠線に沿って線を一本一本繋ぎ、テキストボックスで凡例を添えたりなど)
設計ドキュメントに付属する場合や厳密なタイミング観点の設計検討が必要な場合はExcelで作ることも致し方ないのですが、そうでない場合(例えば、その場限りの議論の資料用途など)、あまり時間を掛けたくない作業です。
要するに、重要度に応じて力の掛け方を変えたい作業な訳です。
ということで、pythonとMatplotlibを使って、タイミングチャートっぽいグラフを(Excelで作成する場合と比較して)簡単に作れるスクリプトを作ることにしました。
入力データ
Excelでチャートを作る代わりに用意するのは時系列データです。ファイル形式はcsvにします。
今回は以下のような単純なデータを用意しました。(とはいえ、実務ではこのレベルのタイミングチャートが必要になる場面は割とある。)
実装
import matplotlib.pyplot as plt
import pandas as pd
# read csv file
df = pd.read_csv('data.csv', index_col=0)
# グラフ情報
GRAPHNUM = len(df.columns) # 数
LABEL = df.columns.values # 種類
## X軸情報(X軸共通化のため別途定義)
x = df.index.values
# データプロットと表示レイアウト
fig, axis = plt.subplots(GRAPHNUM, sharex=True) # 複数グラフを表示するときに使う.この場合は縦に3つ並べて、x軸を共有
for i, d in enumerate(df.T.values):
axis[i].plot(x, d, drawstyle='steps', label=LABEL[i]) # データをステップでプロット
axis[i].set_xticks(x) # ラベル位置指定
axis[i].set_yticks(d) # ラベル位置指定
axis[i].spines['right'].set_visible(False) # 右枠非表示
axis[i].spines['top'].set_visible(False) # 上枠非表示
axis[i].spines['bottom'].set_visible(False) # 下枠非表示
axis[i].legend() # 凡例表示
axis[i].grid(linestyle='--') # グリッド線表示
# 縦方向に、間隔を密にグラフをレイアウト
fig.subplots_adjust(hspace=0.1)
# グラフ表示
plt.show()
結果
さくっと作成するのには十分なクオリティじゃないでしょうかw
終わりに
本スクリプトの改善案があればご意見ください。
また、冒頭でも書きましたが、簡単にタイミングチャートを作成できるツールをご存知であれば教えてください。