LoginSignup
4
11

More than 3 years have passed since last update.

Pythonでグラフ作成アプリを作る

Last updated at Posted at 2021-04-24

今回の記事の概略

今回は以下のようなGUIアプリを作りました。
image.png

はじめに

pythonを開いていちいちグラフを書くのがめんどくさくなったのでアプリ化してしまおうということでtkinterの勉強がてらエクセルファイルを選択してグラフをかけるようにしました。
基本的にネットと一部の書籍を読んだだけの初心者なので改善できるポイントがあれば指摘してほしいです。

全体の流れ

最初にGUI部を四つのFrame部に分けて各Frameにそれぞれグラフを書くのに必要な情報を打ち込めるようにしました。
基本的なFrameやボタン、テキストボックスの理解などはPythonのTkinterを使ってみるや少し古いですがpythonクイックリファレンスを参考にしました。

Frameの分け方

image.png

以上のように4パートのわけて構成を考え、プログラムをしました。
Frame0ではファイルを開く
Frame1ではx,y軸のラベル名を決める
Frame2ではプロットの仕方を点か線にするか、x,y軸のデータをexcelの何列目にするか、実際にグラフを描画するボタン、保存ボタン
Frame3ではグラフの確認window
といった具合に設計しました。

全体のコード



import os
from tkinter import *
from tkinter import ttk
import tkinter.filedialog as file
import pandas as pd
import matplotlib.pyplot as plt
import sys
from matplotlib.backends.backend_tkagg  import FigureCanvasTkAgg
sys.setrecursionlimit(5000)


plt.rcParams['font.family'] = 'Times New Roman' #フォント一括
plt.rcParams["font.size"] = 20
plt.rcParams['ytick.direction'] = 'in'
plt.rcParams['xtick.direction'] = 'in'

root = Tk()
root.title('Graph plot')
root.resizable(False, False)


global fig
global ax

"""
def
"""

global file_name

def file_open():
    ret = file.askopenfilename()
    file1 = ret.replace('/', os.sep)
    global file_name
    file_name = os.path.basename(ret)
    data_path = os.path.dirname(file1)
    os.chdir(data_path)

def date_load(file_name):
    df = pd.read_excel(file_name)
    return df

def pushed(xlabel,ylabel,x,y,file_name,flg):
    global ax
    ax.cla()
    #データロード
    df = date_load(file_name)
    #フォント
    ax.yaxis.set_ticks_position('both')
    ax.xaxis.set_ticks_position('both')
    ax.set_ylabel(ylabel)
    ax.set_xlabel(xlabel)
#    ax.set_xlim(0)
#    ax.set_ylim(0)
    if flg == 1:
        ax.plot(df.iloc[:,x],df.iloc[:,y],color="red")
    if flg == 2:
        ax.scatter(df.iloc[:,x],df.iloc[:,y],c="white",linewidths="1",edgecolors="red")
    plt.tight_layout()
    canvas.draw()

def switching():
    try:
        pushed(xname.get(),yname.get(),int(xaxis.get()),int(yaxis.get()),file_name,var.get())
    except:
        pass


"""
Frame0
"""



frame0 = ttk.Frame(root, padding=(32))
frame0.grid(row=0, column=0, sticky=E)

button = ttk.Button(frame0, text='File Open...',command=file_open, width=45)


"""
Frame1
"""


#上のframe作成
frame1 = ttk.Frame(root, padding=(32))
frame1.grid(row=1, column=0, sticky=E)

#x軸の入力関連
label1 = ttk.Label(frame1,text = "x軸のラベル名")
xname = StringVar()
xname.set("x")
entry1 = ttk.Entry(frame1,textvariable=xname,width=15)

#y軸の入力関連
label2 = ttk.Label(frame1,text = "y軸のラベル名")
yname = StringVar()
yname.set("y")
entry2 = ttk.Entry(frame1,textvariable=yname,width=15)


"""
Frame2
"""

#frame2を作成
frame2 = ttk.Frame(root, padding=(32))
frame2.grid(row=2, column=0, sticky=E)

#x軸の入力関連
label3 = ttk.Label(frame2,text = "x軸")
xaxis = StringVar()
xaxis.set(0)
entry3 = ttk.Entry(frame2,textvariable=xaxis,width=5)

#y軸の入力関連
label4 = ttk.Label(frame2,text = "y軸")
yaxis = StringVar()
yaxis.set(1)
entry4 = ttk.Entry(frame2,textvariable=yaxis,width=5)



label_frame = ttk.Labelframe(frame2,text='Options',padding=(10),
                             style='My.TLabelframe')
#flg管理
var = IntVar()
# value=0のラジオボタンにチェックを入れる,デフォでpoint出力
var.set(2)


# Radiobutton 1
cb1 = ttk.Radiobutton(label_frame,value=1,text='Line',variable=var)

# Radiobutton 2
cb2 = ttk.Radiobutton(label_frame,value=2,text='Point',variable=var)

label_frame.pack(side = LEFT)
cb1.grid(row=0, column=0) # LabelFrame
cb2.grid(row=0, column=1) # LabelFrame

#print Button
button1 = ttk.Button(frame2, text='Print',command = switching)

#save Button
button2 = ttk.Button(frame2, text="save",command = lambda:plt.savefig(file_name+".png"))


"""
Frame3
"""
frame3 = ttk.Frame(root, padding=(32))
frame3.grid(row=0, rowspan = 3,column=1, sticky=E)


fig = plt.figure()
ax = fig.add_subplot(111)


canvas = FigureCanvasTkAgg(fig, master=frame3)
canvas.get_tk_widget().pack(side=BOTTOM, expand=0)
canvas._tkcanvas.pack(side=BOTTOM, expand=0)




"""
パッケージング
"""


#表示させる
button.pack(side=LEFT)
label1.pack(side=LEFT)
entry1.pack(side=LEFT)
label2.pack(side=LEFT)
entry2.pack(side=LEFT)
label3.pack(side=LEFT)
entry3.pack(side=LEFT)
label4.pack(side=LEFT)
entry4.pack(side=LEFT)

button1.pack(side=LEFT)
button2.pack(side=LEFT)


root.mainloop()
4
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
11