はじめに
生きていると
1,1
2,4
3,9
4,16
5,25
6,36
7,49
8,64
9,81
10,100
のような数値データが得られることがあります. こういったデータファイルをプロットする方法はいくつかあります.
例えば, python で matplotlib を用いてpyplot.show() すると GUI 上にグラフが表示されます. 最近気づいたのですが, この GUI 上のプロットは拡大が容易にでき便利です. そこで, いちいち python ~.py とせずにこのプロットを見れるようにした記録を記します.
方針
ファイル(データファイルとは言ってない) __をダブルクリックするとプロットがみられるようにしたい__です. 当然, ダブルクリック一発では何列目をプロットするか, 区切り文字は何かなどといった情報を伝えることはできません. このため, クリックされるファイルはこういった情報を保持している必要があります.
以上を踏まえて, ダブルクリックで.pyファイルを実行する, ようにします. ここでは, __データファイルをimportするとプロットの元となる.pyファイルを生成する__コードを作成することにします. .pyファイルをpythonw.exeに紐づけるとダブルクリックで実行できるようになるのですがこの部分はカバーしません.
参考になった記事
コード作成
作成するプログラムは二つの部分で構成されます. 一つはファイルを読み込んでデータをプロットする部分, もう一つはデータをプロットするプログラムを作成する部分です.
データプロット部分
以下の通りです. 何の変哲もありません.この部分はプロットしたいファイルに応じて適当に書き換える必要があります.
# Import Packages
from matplotlib import pyplot as plt
import numpy as np
# Import Data
## input filename from console
Filename = input()
## import file to "data"
data = np.loadtxt(fname = Filename, delimiter = ",")
# Plot Data
plt.plot(data[:,0], data[:,1])
plt.show()
##プロットプログラム作成部分
以下の通りです.
with open(__file__) as f:
s = f.readlines()
with open(Filename + ".py", mode='w') as f:
for i in range(len(s)):
if(s[i] == "if ExportEnabled:\n"):
exit()
s[i] = s[i].replace("## input filename from console\n", "")
s[i] = s[i].replace("Filename = input()\n", "")
s[i] = s[i].replace('Filename', "\"" + Filename + "\"")
f.write(s[i])
open(file)で自身を開き, それを整形して書き出す,という内容です.プロットファイルをダブルクリックするたびにプロットファイルが作成される必要は全くないので元コードの前半部分のみを複製します.
#完成
コード全体は以下のようになります.
# Import Packages
from matplotlib import pyplot as plt
import numpy as np
# Export Enabled
ExportEnabled = True
# Import Data
## input filename from console
Filename = input()
## import file to "data"
data = np.loadtxt(fname = Filename, delimiter = ",")
# Plot Data
plt.plot(data[:,0], data[:,1])
plt.show()
if ExportEnabled:
with open(__file__) as f:
s = f.readlines()
with open(Filename + ".py", mode='w') as f:
for i in range(len(s)):
if(s[i] == "if ExportEnabled:\n"):
exit()
s[i] = s[i].replace("## input filename from console\n", "")
s[i] = s[i].replace("Filename = input()\n", "")
s[i] = s[i].replace('Filename', "\"" + Filename + "\"")
f.write(s[i])
これを実行して例えば冒頭の"test.dat"をimportすると, "test.dat.py"が作成されます. この"test.dat.py"をダブルクリックすると, matplotlib の GUI でプロットを眺めることができます. メモ帳を開いてデータを見るのと同じ手間で,拡大可能なプロットを眺められるので便利だと思います(たぶん).