アスキーデータからグラフを作成

アスキーファイルのデータをグラフ化する、という作業を仕事で行っているのだが、単調な作業なので自動化すべくwxPythonGUIを作成した。

  • 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])