昼は Python 勉強会お疲れさまでした。アドバイスを頂けてよかったです。
Flask は一旦置いておいて、ばじる氏にいただいたサンプルデータをプロット(グラフ描画)してみましょう。
勉強会の宿題② dat ファイルを解析してみようの続き
「タブ区切りファイル」と「ヘッダがいっぱいあるカンマ区切りファイル」からデータをプロットしてみましょう。
タブ区切りファイルからデータをプロット
2列目をX軸、4列目をY軸としてプロットする(列は0から数える)。タブ区切りのファイルを Pandas データフレームに入れるために、read_table()
を使う。プロットには Matplotlib を使った。
# usage $ python plotmtdata.py filename.dat import sys args = sys.argv import pandas as pd # フォントの設定 import matplotlib.pyplot as plt from matplotlib import rc font = {"family": "Noto Sans CJK JP"} rc('font', **font) filename = args[1] xcol = 2 ycol = 4 # ここからメイン if __name__ == "__main__": df = pd.read_table(filename, header = 0) print(df.head()) plt.figure() #初期化 df.plot(title = filename.split('/')[-1], \ x = df.columns.values[xcol], \ y = df.columns.values[ycol]) plt.savefig(filename+'_'+str(xcol)+'_'+str(ycol)+'.png') plt.close('all') #閉じる print('Saved as', filename+'_'+str(xcol)+'_'+str(ycol)+'.png')
ヘッダがいっぱいあるカンマ区切りファイルからデータをプロット
カンマ区切りのファイルを Pandas データフレームに入れるために、read_csv()
を使う。
上記からの変更点
- 3列目をX軸、4列目をY軸としてプロットする(列は0から数える)
[Data]
と書いてある行の次の行から列ラベルとデータが始まる
# usage $ python plotmhdata.py filename.dat import sys args = sys.argv import pandas as pd import matplotlib.pyplot as plt from matplotlib import rc font = {"family": "Noto Sans CJK JP"} rc('font', **font) filename = args[1] xcol = 3 ycol = 4 # ヘッダ行の行数を数える関数 # [Data] と書いてある行がなければ、False を返す def getHeaderRow(filename): with open(filename) as file: for i, l in enumerate(file): if l == '[Data]\n': return i+1 return False # ここからメイン if __name__ == "__main__": headerrow = getHeaderRow(filename) if headerrow: df = pd.read_csv(filename, skiprows = headerrow, header = 0) print(df.head()) plt.figure() df.plot(title = filename.split('/')[-1], \ x = df.columns.values[xcol], \ y = df.columns.values[ycol]) plt.savefig(filename+'_'+str(xcol)+'_'+str(ycol)+'.png') plt.close('all') print('Saved as', filename+'_'+str(xcol)+'_'+str(ycol)+'.png') else: print(filename+' is not ideal file')
Pandas の関数 read_table()
とread_csv()
メモ
skiprows =
を指定すると、指定した行数分をスキップできる。header =
で列ラベルに使う行を指定する(スキップした分を除いて何行目か)。- タブやカンマで区切られているところにデータが入っていなければ、
NaN
で埋めてくれる。