こんな人にオススメ
グラフを作成するときに毎回、違うグラフタイトルとかを付けないといけない。
けど、毎回コードから修正するのは面倒。どうしたらいい?
ということで、今回はinput
関数とtkinter
を使用して、グラフタイトルとかをポップアップとかで入力してからグラフを作成する方法を解説する。
執筆者自身、研究で使うプログラムで実行するたびにどの条件なのかをグラフに示しておきたいということがあった。
今回はこの状況の簡単版として、グラフタイトルとかをコードの実行開始後にユーザーが入力してから、その結果をグラフに反映する方法を解説する。
python環境は以下。
- Python 3.9.7
- matplotlib 3.4.3
作成したコード全文
下準備
import matplotlib.pyplot as plt import tkinter as tk x = [0, 1, 2] y = [0, 2, 1]
まずは下準備としてのimport
関連。今回は使うライブラリが少なめ。tkinter
はpythonの標準ライブラリなのでpythonをインストールしたら入ってると思う。
tkinter
自体はGUIを作成できる、つまりポップアップ的な感じで文字入力とかボタンとかを配置できるというもの。以下の画像の左上のウィンドウが一例。
サイズとか色とかカスタムができるし、OSによっても見た目が随分と異なるため、あくまでもイメージとして捉えていただければと思う。以下の画像のOSはmacOS。
関数の引数に入力文字を入れる
今回はグラフを描きたいわけだが、そのための関数をまずは紹介。シンプルにx
とy
でグラフ化している。
関数の引数でグラフタイトル、横軸ラベル、縦軸ラベル、そしてグラフの保存名を決めている。
def graph(title, xlabel, ylabel, save_name): fig, ax = plt.subplots(1, 1) ax.set_title(title) # タイトル ax.set_xlabel(xlabel) # 横軸ラベル ax.set_ylabel(ylabel) # 縦軸ラベル ax.plot(x, y) # fig.savefig(save_name) plt.show()
この関数を呼び出す場合は以下のように関数に引数を入れたらいいけど、これだと毎回コードをいじらないといけない。面倒。
# 毎回コードに打たないといけない graph(title='title', xlabel='xlabel', ylabel='ylabel', save_name='func')
この引数を今回はコード実行時に指定できるようにする。
input
関数でターミナル上に表示
def ask_input(): ans = [] title = input('グラフタイトルを入力: ') xlabel = input('横軸ラベルを入力: ') ylabel = input('縦軸ラベルを入力: ') ans = { 'title': title, 'xlabel': xlabel, 'ylabel': ylabel, } return ans
まずは王道のinput
関数を使用する方法。ターミナル上に文字入力をして、それを使ってタイトルとかを指定する。
input()
だけでも使用する事は可能だが、その場合はターミナル上に何も文字が出ず、止まっているのか文字が出ていないのかがわかりにくい。
返り値のans
でタイトルとラベルを返し、それを使ってグラフを作成したのが以下。
# コンソール(ターミナル)上で入力が求められる ans = ask_input() title = ans['title'] xlabel = ans['xlabel'] ylabel = ans['ylabel'] graph(title=title, xlabel=xlabel, ylabel=ylabel, save_name='input')
例えば、以下のようにターミナルで指定すると、その通りにグラフが作成される。
tkinter
でテキストボックスを作成
# テキストボックスに何を入れるのかを示すためのラベル def label(x, y, text): label = tk.Label(text=text) label.place(x=x, y=y) # テキストボックス作成 def textbox(x, y, text): # ラベルを表示 label(x=x - 30, y=y, text=text) # -30だとx=0が左端に来た text = tk.StringVar() # 文字列を入れるためのウィジェット tk.Entry(textvariable=text).pack() # テキストボックスを配置 return text
input
関数を使用する方法でもいいんだけど、入力画面がダサめ。という事でGUIであるtkinter
を使用する方法を解説。
tkinter
を使用したウィンドウの例は既に出したが、ここではあれを作成する。あのウィンドウに入力したタイトルと軸ラベルがそのままグラフに反映される。
上のlabel関数がどのテキストボックスがどの入力に対応するかを、textbox
関数がグラフに反映させるテキストボックスを示している。
本当は色々と設定できる項目があるけど、とりあえず表示と簡単なレイアウトは上記でいける。使用しているOSやディスプレイ設定などで若干、表示が崩れるかもしれないけど、その時は適宜調節してほしい。
これら2つの関数を使用して、入力値をグラフに反映させる関数が以下。やってることは基本はinput
関数の時と同じ。
# テキストボックスを配置し、GUIで表示 def get_inputtext(): root = tk.Tk() # ウィンドウを作成 root.geometry('300x200') # 画面全体のサイズを指定 root.title('タイトル、横・縦軸ラベルを入力') # 画面のタイトル # グラフタイトル、横・縦軸ラベルを配置 title = textbox(x=30, y=0, text='title') xlabel = textbox(x=30, y=30, text='xlabel') ylabel = textbox(x=30, y=60, text='ylabel') # 入力決定ボタンを配置 tk.Button(text='決定', width=8, command=root.destroy).pack() root.mainloop() # 入力結果は辞書にまとめる ans = { 'title': title.get(), 'xlabel': xlabel.get(), 'ylabel': ylabel.get(), } return ans
この関数を使用して以下のように入力した時のグラフを作成。
ちゃんと意図した通りにグラフかできた。
執筆者は使わなかった
今回はコード実行ごとにユーザーに入力を求め、その入力をグラフに反映させる方法について解説した。
確かに多くの測定データを複数人で同じコードで回す際にはこの方法は良いかもしれない。実際、研究室ではtkinter
を使用してコードを作成している先輩もいた。
しかし、執筆者の研究では正直あまり使う事はなかった。なぜか。面倒だから。一回やってみて、毎回ポップアップが出るのが面倒。
自分自身・チームで最適な手法を検討していただければと思う。
関連記事
-
-
【python&~】数値にチルダ(~)をつけると値が+1されて負の数になる(ビット反転)
続きを見る
-
-
【plotly&ボタン】グラフに複数種のボタンを追加
続きを見る
-
-
【plotly&コッホ曲線】フラクタル図形の雪の結晶をスライダーで作成してみる
続きを見る
-
-
【辞書の結合】dictのマージ
続きを見る