アスキーデータからグラフを作成
アスキーファイルのデータをグラフ化する、という作業を仕事で行っているのだが、単調な作業なので自動化すべくwxPythonでGUIを作成した。
- GUIを起動
- 目的のアスキーファイルを読み込む(複数可)
- データ番号を選んでボタンを押す
- グラフがファイルとして保存される
- py2exeでバイナリを作成しようとしたが相変わらずmatplotlibで引っかかる
データフォーマットは、自分が扱っているファイルのものに特化されているので、他の人には役に立たないと思うが、ソースをのせておく。
ファイル1(_main_tree.py)
#!/bin/env python # coding: utf-8 # --------------------- _main_tree.py ----------------------------- import os, sys import wx import MainFrame class Application(wx.App): def OnInit(self): frame = MainFrame.MainFrame(None, -1) frame.Show(True) self.SetTopWindow(frame) return True def main(): import time app = Application(0) print u"info> このアプリケーションの起動時刻は %sです。" % time.ctime(time.time()) print u"info> 起動ディレクトリは %sです。" % os.getcwd() app.MainLoop() if __name__ == '__main__': main()
ファイル2(MainFrame.py)
#!/bin/env python # coding: utf-8 # --------------------- MainFrame.py ----------------------------- import wx import wx.grid import os import sys from pylab import * wildcard1 = "Converted file (*.gp)|*.gp|" \ "All files (*.*)|*.*" class MainFrame(wx.Frame): def __init__(self, id, title): width, height = 700,600 wx.Frame.__init__(self, id, title=u"Making figures from data files", size=wx.Size(width, height)) Pan = wx.Panel(self, -1) self.table = DataTable(Pan) self.table2= DataTable2(Pan) self.StTxt = wx.StaticText(Pan, -1, u"選択されたファイル") self.StTxt2= wx.StaticText(Pan, -1, u" ") self.StTxt3= wx.StaticText(Pan, -1, u"ファイルに記録されているデータ") self.StTxt4= wx.StaticText(Pan, -1, u" ") self.Btn = wx.Button(Pan, -1, u"ファイルを順番に選択する") self.Btn2 = wx.Button(Pan, -1, u"すべてのファイルの選択完了") self.SpnC = wx.SpinCtrl(Pan, -1, '1', min=1, max=1000) self.StTxt5= wx.StaticText(Pan, -1, u"番のデータの") self.Btn3 = wx.Button(Pan, -1, u"グラフを作成する") self.Btn.Bind(wx.EVT_BUTTON, self.SelectFiles) self.Btn2.Bind(wx.EVT_BUTTON, self.DoneSelection) self.Btn3.Bind(wx.EVT_BUTTON, self.MakingFigs) vsizer1 = wx.BoxSizer(wx.VERTICAL) vsizer2 = wx.BoxSizer(wx.VERTICAL) vsizer3 = wx.BoxSizer(wx.VERTICAL) vsizer4 = wx.BoxSizer(wx.VERTICAL) vsizer = wx.BoxSizer(wx.VERTICAL) hsizer1 = wx.BoxSizer(wx.HORIZONTAL) hsizer2 = wx.BoxSizer(wx.HORIZONTAL) vsizer1.Add(self.StTxt, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer1.Add(self.table, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer3.Add(self.StTxt3,0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer3.Add(self.table2,0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer2.Add(self.StTxt2,0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer2.Add(self.Btn, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer2.Add(self.Btn2, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer4.Add(self.StTxt4,0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer4.Add(self.SpnC, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer4.Add(self.StTxt5,0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer4.Add(self.Btn3, 0, wx.ALIGN_LEFT|wx.ALL, 5) hsizer1.Add(vsizer1, 0, wx.ALIGN_LEFT|wx.ALL, 5) hsizer1.Add(vsizer2, 0, wx.ALIGN_LEFT|wx.ALL, 5) hsizer2.Add(vsizer3, 0, wx.ALIGN_LEFT|wx.ALL, 5) hsizer2.Add(vsizer4, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(hsizer1, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(hsizer2, 0, wx.ALIGN_LEFT|wx.ALL, 5) Pan.SetSizer(vsizer) vsizer.Fit(Pan) def SelectFiles(self, event): dlg = wx.FileDialog( self, message="Select a file converted by histgn", defaultDir=os.getcwd(), defaultFile="", wildcard=wildcard1, style=wx.OPEN|wx.CHANGE_DIR) if dlg.ShowModal() == wx.ID_OK: self.table.VNumber += 1 self.table.TitleList.append(dlg.GetFilename()) self.table.UpdateList(self.table.VNumber, dlg.GetFilename()) dlg.Destroy() def DoneSelection(self, event): filen = self.table.TitleList[0] input = open(filen, 'r') for x in xrange(3): input.readline() while 1: tmpString = input.readline() if tmpString.split()[0] != '#': break self.table2.VNumber += 1 self.table2.TitleList.append(tmpString[5:-1]) self.table2.UpdateList(self.table2.VNumber) def MakingFigs(self, event): temp1 = [] temp2 = [] for fname in xrange(self.table.VNumber): input = open(self.table.TitleList[fname]) L = input.readlines() input.close() for i in xrange(26, len(L), 1): temp1.append(float(L[i].split()[0])/3.1416) temp2.append(L[i].split()[self.SpnC.GetValue()]) fig = figure() ax = fig.add_subplot(111) ax.plot(temp1, temp2, 'k', color='r', linewidth=2.0) xlabel('Time [rev]') ax.autoscale_view() fig.savefig('tempfig') show() class DataTable(wx.grid.Grid): def __init__(self, parent): wx.grid.Grid.__init__(self, parent, -1) self.InitRow = 5 self.CreateGrid(self.InitRow, 1) self.SetColLabelValue(0, u"ファイル名") self.SetColSize(0, 400) self.VNumber = 0 self.TitleList = [] def UpdateList(self, RowNum, filen): if RowNum > self.InitRow: self.AppendRows(RowNum-self.InitRow) self.InitRow = RowNum self.SetCellValue(RowNum-1, 0, filen) class DataTable2(wx.grid.Grid): def __init__(self, parent): wx.grid.Grid.__init__(self, parent, -1) self.InitRow = 15 self.CreateGrid(self.InitRow, 1) self.SetColLabelValue(0, u"データの種類") self.SetColSize(0, 400) self.VNumber = 0 self.TitleList = [] def UpdateList(self, RowNum): if RowNum > self.InitRow: self.AppendRows(RowNum-self.InitRow) self.InitRow = RowNum for Row in xrange(RowNum): self.SetCellValue(Row, 0, self.TitleList[Row])