NumPyでは配列ndarrayをNumPy独自のバイナリファイルnpyファイルという形式で保存できます。
これで機械学習などの混同行列などの結果を保存していました。
このファイルはバイナリファイルなので、ダブルクリックしても特に有用な情報は得られず、
開けばすぐに混同行列を表示してくれるようにしたいなと思いました。
ということで、pythonのwxPythonというライブラリでドラッグ&ドロップで混同行列が表示されるようにしてみました。
wxPython
wxPythonとはpython3で使えるGUIツールキットです。
まずはインストールしておいてください。
pip install wxPython
最も簡単なサンプルコードは以下になります。
import wx
app = wx.App()
frame = wx.Frame(None, -1, 'Hello,World!',size=(500,500))#
frame.Show()
app.MainLoop()
これを利用して、ウィンドウに.npyファイルをドラッグ&ドロップすることで混同行列がplotされるようにします。
本当はウィンドウ内に表示される方がよかったのですが、D&Dするとmatplotlibで新たにplotされるだけです。
ウィンドウ内への表示は今後の課題とします。
ソースコードは以下の通りです。
# -*- coding: utf-8 -*-
import wx
import os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.metrics import confusion_matrix
class MyFileDropTarget(wx.FileDropTarget):
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, filenames):
# ファイルパスをテキストフィールドに表示
for file in filenames:
self.window.text.SetValue(file)
f = np.load(''.join(filenames))#ファイルパスからファイルロード
df_cmx = pd.DataFrame(f)#pandas変換
plt.figure(figsize = (10,7))
sns.heatmap(df_cmx, annot=True)#seabornで混同行列表示
plt.show()#可視化
return True
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Drop Target", size=(500, 200))
p = wx.Panel(self)
sizer = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(p, -1, "File name:")
self.text = wx.TextCtrl(p, -1, "", size=(400, -1))
sizer.Add(label, 0, wx.ALL, 5)
sizer.Add(self.text, 0, wx.ALL, 5)
p.SetSizer(sizer)
dt = MyFileDropTarget(self)
self.SetDropTarget(dt)
self.Show()
if __name__ == '__main__':
app = wx.App()
MyFrame()
app.MainLoop()
これを実行すると以下のようになります。
このウィンドウに混同行列の結果を保存した.npyファイルをドラッグ&ドロップ
新たなウィンドウで表示されます。
やっていることはファイルのパスを取得して、np.loadして、描画してるだけです。
本当はwx.Image()として混同行列を渡してあげればウィンドウ内に表示できるはずなんですが、、、
やり方がわかりませんでした。
解決したら修正します。
とりあえず、混同行列がすぐに見られるようになったので良しとします。
Sponsored Link