アイソモカ

知の遊牧民の開発記録

開発記録 191215 Sun (Pandas と Matplotlib)

昼は 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で埋めてくれる。