.npyファイルをドラッグ&ドロップで表示

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です