今回は、一般の仕事でも使えるかもしれない自動化プログラムを組んでいきたいと思います。
タイトルの通り、csvファイルに入っている数値データをまとめて、プロットしていきます。
root ┬ sample_a.csv
├ sample_b.csv
├ sample_c.csv
└ sample_d.csv
上記のように一つのフォルダにcsvファイルが複数入っており、
それぞれのcsvファイルに数値データが10個ずつ入っているとします。
今回は、4つのファイルからデータを抜き取って、最後に平均を追加して棒グラフでプロットしていきます。
目標はこんな感じ。
csvファイルの数はいくつでも対応できるようにしていきます。
ファイルの拡張子もcsv以外も混ざっていても大丈夫なように条件分岐しておきます。
ソースコードは以下です。
コメントで説明していますが、基本的には.csvのファイルを一つずつ読み込んでは、追加していき最後にプロットするだけです。
import matplotlib.pyplot as plt
import numpy as np
import os
import csv
file_path="お好きなcsvファイルの入ったフォルダのパス"#rootへのパス(各々合わせる)
data = []#全ての数値データを入れる、データフレーム型変数
for file in os.listdir(file_path):#file_pathフォルダにある、ファイル・ディレクトリ一覧をos.listdir()で取得できる。その要素ごとにforループ
base, ext = os.path.splitext(file)#ファイル名から拡張子とそれ以外に分離。baseにファイル名。extに拡張子(.csv)が格納される
if ext == '.csv':#拡張子が.csvの時のみファイルを読み込む
tmp_csv_file =open(file_path+file, "r", encoding="ms932", errors="", newline="")#ファイルオブジェクト作成
f = csv.reader(tmp_csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True, quoting=csv.QUOTE_NONNUMERIC)#ファイル読み込み(lineterminatorで改行をしているので、改行ごとに読み込む)
for row in f:#読み込んだファイルを改行ごとに処理していく
row.append(sum(row)/len(row))#rowの末尾に平均値を追加する
data.append(row)#dataに追加
print(data)
file_num = len(data)#ファイルの数。プロットのデザインに必要
width = 0.2#棒グラフの幅
x = np.arange(1,len(data[0])+1)#プロット位置のためのリスト
x_label = [str(i) for i in range(len(data[0])-1)]#横軸に表示する要素。今回は、データのi番目をiとして、最後にaverageを追加する
x_label.append("average")
print(x)
for i in range(file_num):
plt.bar(x+(i*width),data[i],width=width, align="center")#プロット
plt.ylim(0,100)#縦軸の値の範囲を設定
plt.xticks(x+((file_num-1)*width)/2,x_label)#横軸の位置決めとラベルのセット
plt.show()
プロットの位置をずらしていくのがポイントです。
皆さんもためしてみてください
Sponsored Link