3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

plt.plot() の個人用簡易テンプレ

Last updated at Posted at 2019-07-31

Pythonのmatplotlibというグラフ描画ライブラリで比較的簡単に綺麗なグラフが作成できることを知ったので、個人的メモ。以前、論文執筆や研究発表などの場面でグラフに統一感を出したいときに、Excelで描画のディティールの調整にあくせくしたことがあったので、一度志向を変えて、プログラミング言語付属ライブラリによるグラフ作成に挑戦してみた。クロスプラットフォーム対応グラフ作成ソフトの有名どころとしては「gnuplot」もあるが、デフォルトの外観としてはmatplotlibが個人的に気に入ったので、今後もこちらの可能性を引き続き模索していきたい。

#Python ソースコード

pyplot.py
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()

出力結果

Images01.png

#入力ファイル(CSV形式)

sample.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の有無がわからないことにある。

Images02.png
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?