ダブルクリックで実行できるPythonプログラムに向けて
前回から簡単に実行できるPythonプログラムを作成する方法の解説を行なっています。

といいつつもまだまだ準備段階。
今回は前回から続いて、格納したデータを使って計算し、グラフ表示・保存、そしてCSVファイルとして保存をしていきます。
とりあえず前回のおさらいから。
インポートしたものはこの二つ。
from matplotlib import pyplot as plt
import csv
そしてメインのプログラムはこんな感じ。
filename = "testdata.csv"
output_fig = "out_fig.png"
output_data = "test_out.csv"
f = open(filename, "r")
reader = csv.reader(f)
x = []; y1 = []; y2 = []
for row in reader:
x.append(int(row[0]))
y1.append(int(row[1]))
y2.append(int(row[2]))
print(x)
print(y1)
print(y2)
f.close()
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
ここからまずはy1とy2の値を掛け算していきます。
y1とy2を掛け算する
y1とy2を掛け算するには、それぞれの値を一つずつ取り出し、掛け算して、新しいリストに格納すると言うことが必要になります。
その部分のプログラムだけ書き出してみるとこんな感じです。
y1y2 = []
for y1_each, y2_each in zip(y1, y2):
y1y2.append(y1_each*y2_each)
「y1y2 = []」で掛け算した値を格納する空のリストを作ります。
そして「for y1_each, y2_each in zip(y1, y2):」 でリストy1とy2から一つずつ取り出し、変数y1_each、y2_eachに格納します。
最後に「y1y2.append(y1_each*y2_each)」で二つの値を掛け算し、リストy1y2に格納するという流れです。
確認のため最後に「print(y1y2)」を足して、どうなるか見てみましょう。
filename = "testdata.csv"
output_fig = "out_fig.png"
output_data = "test_out.csv"
f = open(filename, "r")
reader = csv.reader(f)
x = []; y1 = []; y2 = []
for row in reader:
x.append(int(row[0]))
y1.append(int(row[1]))
y2.append(int(row[2]))
f.close()
y1y2 = []
for y1_each, y2_each in zip(y1, y2):
y1y2.append(y1_each*y2_each)
print(y1y2)
実行結果
[20, 80, 240, 640, 1600, 3840, 8960, 20480, 46080, 102400]
ちゃんと掛け算した値が表示されました。
グラフの作成と保存
次にx値とy1とy2を掛け算した値をグラフにしていきます。
グラフのプロットの基本操作に関してはこちらの記事をご覧ください。

そのグラフ作成の部分を一番単純な形でプログラムしてみるとこうなります。
fig = plt.figure()
plt.plot(x, y1y2)
plt.savefig(output_fig)
plt.show()
「fig = plt.figure()」でグラフエリアを作成し、「plt.plot(x, y1y2)」でデータをプロット、「plt.savefig(output_fig)」でグラフを保存、「plt.show()」でグラフ表示するという流れです。
全体のプログラムを書いてみるとこうなります。
filename = "testdata.csv"
output_fig = "out_fig.png"
output_data = "test_out.csv"
f = open(filename, "r")
reader = csv.reader(f)
x = []; y1 = []; y2 = []
for row in reader:
x.append(int(row[0]))
y1.append(int(row[1]))
y2.append(int(row[2]))
f.close()
y1y2 = []
for y1_each, y2_each in zip(y1, y2):
y1y2.append(y1_each*y2_each)
fig = plt.figure()
plt.plot(x, y1y2)
plt.savefig(output_fig)
plt.show()
実行結果

「out_fig.png」という名前で上のようなグラフが保存されていれば成功です。
CSVファイルとして保存
最後にCSVファイルとして保存していきます。
このCSVファイルとして保存する部分のプログラムはこんな感じです。
f = open(output_data, "w")
for x_each, y1y2_each in zip(x, y1y2):
f.write(str(x_each) + ",")
f.write(str(y1y2_each) + "\n")
f.close()
まず「f = open(output_data, “w”)」で変数output_dataに書いた名前で新しいファイルを作成し、開きます。
「for x_each, y1y2_each in zip(x, y1y2):」でリストxとy1y2から値を一つずつ取り出し、変数x_each、y1y2_eachに格納します。
そして「f.write(str(x_each) + “,”)」でx値を、「f.write(str(y1y2_each) + “\n”)」でy1y2値を書き出します。
ちなみに「+ “,”」があるのはCSVファイルとするため、「+ “\n”」としているのは改行するためです。
そして最後に「f.close()」で書き出したファイルを閉じます。
ということで全体を書いてみるとこんな感じです。
filename = "testdata.csv"
output_fig = "out_fig.png"
output_data = "test_out.csv"
f = open(filename, "r")
reader = csv.reader(f)
x = []; y1 = []; y2 = []
for row in reader:
x.append(int(row[0]))
y1.append(int(row[1]))
y2.append(int(row[2]))
f.close()
y1y2 = []
for y1_each, y2_each in zip(y1, y2):
y1y2.append(y1_each*y2_each)
fig = plt.figure()
plt.plot(x, y1y2)
plt.savefig(output_fig)
f = open(output_data, "w")
for x_each, y1y2_each in zip(x, y1y2):
f.write(str(x_each) + ",")
f.write(str(y1y2_each) + "\n")
f.close()
実行すると先ほどの「out_fig.png」ともう一つ「test_out.csv」というファイルが作成されます。
その「test_out.csv」の中身はこんな感じです。

これでとりあえず動くプログラムを作成することができました。
次回はこのプログラムをダブルクリックで実行できるように変えていきましょう。

ということで今回はこんな感じで。
コメント