本サイトは広告・プロモーションが含まれています
Python

【Pythonアプリ作成】tkinterとpandasでグラフ描画アプリを作成する【コピペ使用OK】


どうもこんにちは。コンです。

今回は、これまで解説させていただいた
Classの書き方やpandasを用いたExcelの読み込み方法を応用して

Excelを読み込んでグラフを描画するアプリの作成について解説したいと思います。


作成したデスクトップアプリ


今回作成したアプリは Excelを読み込むんでグラフを作成するアプリです。

左下のOpen Fileボタンを押すと Excelファイルを選ぶと、x軸とy軸の種類を選択できるようになり、Plot Graphボタンを選択するとグラフを描画できるアプリです。

この時下のLineとScatterでグラフを折線グラフか散布図かを選ぶ事ができるようになります。

今回描画した Excelの中身は、
千葉商科大学さん(https://www.cuc.ac.jp/)の提供してくださっているプロ野球選手のポジション・身長・体重のデータを描画してます。

アプリのコード


今回のアプリは、1つのPythonコードのファイルだけで作成しました。

import tkinter as tk
from tkinter import filedialog
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class GraphPlotter:
    def __init__(self, master):
        self.master = master
        master.title("Graph Plotter")

        self.file_path = ""
        self.data = pd.DataFrame()

        #ラベルとリストボックスの作成
        self.x_label = tk.Label(master, text="x軸")
        self.y_label = tk.Label(master, text="y軸")
        self.x_listbox = tk.Listbox(master, selectmode=tk.SINGLE, selectforeground="red", exportselection=False)
        self.y_listbox = tk.Listbox(master, selectmode=tk.SINGLE, selectforeground="red", exportselection=False)

        #ラベルとリストボックスの配置
        self.x_label.grid(row=1, column=0)
        self.y_label.grid(row=1, column=1)
        self.x_listbox.grid(row=2, column=0)
        self.y_listbox.grid(row=2, column=1)

        
        #ファイル読み込みとグラフ描画のボタン
        self.file_button = tk.Button(master, text="Open File", command=self.load_file)
        self.plot_button = tk.Button(master, text="Plot Graph", command=self.plot_graph)

        #グラフ種類を選択するラジオボタン
        self.graph_type = tk.StringVar(value="line")
        self.line_rb = tk.Radiobutton(master, text="Line", variable=self.graph_type, value="line")
        self.scatter_rb = tk.Radiobutton(master, text="Scatter", variable=self.graph_type, value="scatter")

        #グラフの描画
        self.fig = plt.Figure(figsize=(5, 4), dpi=100)
        self.ax = self.fig.add_subplot(111)
        self.canvas = FigureCanvasTkAgg(self.fig, master=master)
        self.canvas.get_tk_widget().grid(row=3, column=0, columnspan=2)

        #ボタンや文字の配置
        self.file_button.grid(row=4, column=0, pady=10)
        self.plot_button.grid(row=4, column=1, pady=10)
        self.line_rb.grid(row=5, column=0)
        self.scatter_rb.grid(row=5, column=1)

    #ファイルを読み込む
    def load_file(self):
        self.file_path = filedialog.askopenfilename(filetypes=[("Excel Files", "*.xlsx")])
        if self.file_path:
            #pandasで選んだデータを読み込む
            self.data = pd.read_excel(self.file_path)
            columns = self.data.columns.tolist()
            self.x_listbox.delete(0, tk.END)
            self.y_listbox.delete(0, tk.END)

            for column in columns:
                self.x_listbox.insert(tk.END, column)
                self.y_listbox.insert(tk.END, column)

    #グラフの描画
    def plot_graph(self):
        self.ax.clear()

        x_column = self.x_listbox.get(tk.ACTIVE)
        y_column = self.y_listbox.get(tk.ACTIVE)
        x_data = self.data[x_column]
        y_data = self.data[y_column]

        self.ax.set_xlabel(x_column)
        self.ax.set_ylabel(y_column)

        if self.graph_type.get() == "line":
            self.ax.plot(x_data, y_data)
        elif self.graph_type.get() == "scatter":
            self.ax.scatter(x_data, y_data)

        self.canvas.draw()

def main():
    root = tk.Tk()
    GraphPlotter(root)
    root.mainloop()

if __name__=='__main__':
    main()

このコードは、Tkinterを使用してGUIアプリケーションを作成し、pandasを使用してExcelファイルからデータを読み取り、matplotlibでグラフをプロットします。

主なポイントは以下の通りです。

  1. GraphPlotterクラスは、Tkinterのフレームワークを使用して、ウィンドウとウィジェットを作成する。
  2. 「Open File」ボタンを使用して、Excelファイルを開くダイアログボックスを表示し、選択したファイルを読み込むように設定。
  3. 「Plot Graph」ボタンを使用して、選択されたデータのグラフをプロットする設定

このコードでは、GUIアプリケーションの作成、データの読み込み、グラフのプロットなど、いくつかの重要なコンセプトが含まれています。

①tkinterのウィンドウとウィジェット

tkinterは、Pythonの標準ライブラリであるGUIツールキットです。tkinterを使用することで、PythonでGUIアプリケーションを作成することができます。

tkinterでは、ウィンドウを作成するためのTk()クラスがあります。このクラスをインスタンス化することで、新しいウィンドウを作成することができます。

ウィンドウには、フレームやボタン、テキストボックス、メニューバーなどのウィジェットを追加することができます。ウィジェットは、Label()Button()Entry()Menu()などの関数を使用して作成することができます。実際に上のコードではLabel()やListBox()などのウィジェットを使用してます

ウィジェットを配置するために、grid()pack()place()の3つのメソッドが使用できます。
例えば今回紹介したコードではgrid()メソッドを使い、ウィジェットをグリッドのように配置してます。

②「Open File」ボタンを使用して、Excelファイルを開くダイアログボックスを表示し、選択したファイルを読み込む。

今回のコードは、ファイルダイアログで選択されたExcelファイルを pd.read_excel() メソッドで読み込んでいます。Excelファイルから読み込んだデータを self.data 変数に格納し、その列名を columns 変数に取得します。

取得した列名は、forループを使用して、self.x_listboxself.y_listbox の2つのリストボックスに挿入されます。これにより、ユーザーは各リストボックスからx軸とy軸に対応するデータを選択できます。

具体的には、 self.x_listboxself.y_listbox には、 tk.END というインデックスを指定して、それぞれのリストボックスに新しい項目を追加するために、forループで列名を insert メソッドを使って挿入しています。そして、self.x_listbox.get(tk.ACTIVE) および self.y_listbox.get(tk.ACTIVE) を使用して、選択された列名を取得し、 x_datay_data 変数にそれぞれ代入されます。

③「Plot Graph」ボタンを使用して、選択されたデータのグラフをプロットする。

「Plot Graph」ボタンを押すと以下のようにコードが動きます。

  1. plot_graph関数が呼び出されます。
  2. x_listboxy_listboxのうち、選択された列名を取得します。
  3. 選択された列のデータを、self.dataから取得します。
  4. matplotlibを使用して、選択されたグラフの種類に応じてグラフを描画します。
  5. self.canvas.draw()を使用して、描画されたグラフをtkinterのウィンドウ上に表示します。


したがって、このプログラムを実行すると、Excelファイルを選択して、x軸とy軸の列を選択した上で、「Plot Graph」ボタンを押すことで、選択されたデータのグラフが表示されます。また、ラジオボタンを切り替えることで、折れ線グラフと散布図のどちらを描画するかを切り替えることができます。

おわりに


ここまで読んでいただき、ありがとうございました。

今回はPythonの部分的な解説ではなく、
職場でも配布できるつもりで、みなさまのPCで起動できるところまでコードを書かせていただきました。

実際に職場で配布するには、このコードをpyinstallerでexe化したりして配布しております。
Pythonをインストールしなくてもインストールできるように。

今回のコードについては他の私のブログも参考になるので、読んでいただけると嬉しいです。


最近UdemyなんかでもPythonの勉強をしているので、少しづつコードを書くペースが上昇している気がします。
とくにPythonの講座はたくさん開催されているのでオススメです!!

プログラミング言語の人気オンラインコース

ここまで読んでいただき、ありがとうました。
今回のデスクトップアプリのコードが皆様の何かしらの参考になれば嬉しいです。

それでは。

COMMENT

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

CAPTCHA