Pythonのmatplotlibというグラフ描画ライブラリで比較的簡単に綺麗なグラフが作成できることを知ったので、個人的メモ。以前、論文執筆や研究発表などの場面でグラフに統一感を出したいときに、Excelで描画のディティールの調整にあくせくしたことがあったので、一度志向を変えて、プログラミング言語付属ライブラリによるグラフ作成に挑戦してみた。クロスプラットフォーム対応グラフ作成ソフトの有名どころとしては「gnuplot」もあるが、デフォルトの外観としてはmatplotlibが個人的に気に入ったので、今後もこちらの可能性を引き続き模索していきたい。
#Python ソースコード
import sys
import numpy as np
import matplotlib.pyplot as plt
import csv
argv = sys.argv
input = argv[1]
csvReader = csv.reader(open(input, "r"), delimiter=',')
buffer = []
for row in csvReader:
dataCols = len(row)
for i in range(len(row)):
buffer.append(row[i])
dataRows = int(len(buffer) / dataCols)
# read info from .csv file
dataOffset = 4;
data = [[0 for j in range(dataRows - dataOffset)] for i in range(dataCols)]
for i in range(dataCols):
for j in range(dataOffset, dataRows):
data[i][j - dataOffset] = buffer[j * dataCols + i]
# read data from .csv file
infoRows = dataOffset
infoCols = dataCols
info = [[0 for j in range(infoRows)] for i in range(infoCols)]
for i in range(infoCols):
for j in range(infoRows):
info[i][j] = buffer[j * infoCols + i]
for i in range(infoCols - 1):
plt.plot(np.array(data[0], dtype=float), np.array(data[i+1], dtype=float), label=info[i+1][0], marker=info[i+1][1], color=info[i+1][2], linestyle=info[i+1][3])
plt.xlabel("xlabel")
plt.ylabel("ylabel")
plt.legend()
plt.show()
出力結果
#入力ファイル(CSV形式)
label,sin,cos,sin/x
marker,o,v,^
color,red,blue,green
linestyle,-,-.,:
0.1,0.099833417,0.995004165,0.998334166
0.2,0.198669331,0.980066578,0.993346654
0.3,0.295520207,0.955336489,0.985067356
...(中略)...
9.8,-0.366479129,-0.930426272,-0.03739583
9.9,-0.457535894,-0.889191153,-0.046215747
10,-0.544021111,-0.839071529,-0.054402111
csvファイルを読み込んだ後、x軸(0列目)に対するy軸(1-3列目)の2次元プロットを行う。冒頭4行は、「ラベル」「マーカー」「色」「線種」を指定。細かなエラーチェックはしていないが、簡易テンプレとしては十分だと思う。
途中、引っかかったポイントがひとつ。
ExcelからCSVファイルを出力する際、保存形式「CSV UTF-8 (コンマ区切り) 」では、ファイル先頭に3バイトのバイトオーダーマーク(BOM: Byte Order Mark)が自動で挿入されていて、おそらくそれが原因で
csvReader = csv.reader(open(input, "r"), delimiter=',')
では、正しくデータを読み取ってくれなかった(Python 3.7.3)。なので、上記のソースでは、BOMの付かない保存形式「CSV (コンマ区切り) 」で出力したファイルをopenしてあげないと期待した結果とはならない。これのやっかいな点は、テキストエディタで両者を見比べても外観上の違いはなく、バイナリエディタで確認しないとBOMの有無がわからないことにある。