ウィンドウ(Tkinter)で入力した範囲(定義域)のグラフを作成する。
Pythonは拡張性が高く、コードが非常にシンプルで書けて、
アプリ開発や人工知能までを網羅しているため、
初心者から上級者まで幅広く愛させているプログラミング言語です。
特に理系の方はプログラミングでグラフをプロットすることが度々あり、
Pythonで作成する方も多いかと思います。
本記事では、ユーザーが入力した数値に応じて、グラフをプロットする方法を紹介します。
統計学で役に立つPythonのライブラリをまとめました。あわせてご覧ください。
- Pythonでグラフを作れるようになりたい人
- Tkinter、NumPy、Matplotlibのモジュールについて知りたい
ConoHaWing開設方法|アリッシア
技術ブログを書くべき理由|アリッシア
Tkinter
Tkinterは、Pythonの標準ライブラリとして含まれている
グラフィカルユーザーインターフェース(GUI)を作成します。
Tkinterの基本構造は以下の通りです。
import tkinter as tk
# メインウィンドウを作成する
window = tk.Tk()
window.title("Hello,Tkinter")
#####################GUI要素#####################
# ラベル
label = tk.Label(window, text="Tkinter")
label.pack()
#ボタン
button = tk.Button(window, text="Tkinter")
button.pack()
# テキストボックス
txtBox = tk.Entry(width=20)
txtBox.pack()
#チェックボタン
Checkbtn=tk.Checkbutton()
Checkbtn.pack()
#################################################
# メインイベントループ
window.mainloop()
Tkinterは、GUI要素で示したようにラベルやボタンなどのウィジェットがあり、
複雑なインターフェースを構築するために使用できます。
また、ボタンをクリックさせるユーザーアクションに
応答するための処理も定義することもできます。
ただし、Tkinterの機能は、
基本的なGUIアプリケーションやプロトタイプ作成には十分ですが、
高度なGUI制作には不向きです。
NumPy
NumPyは、Numerical(数値) Pythonの略で、数値計算に使用されるPythonライブラリです。
NumPyは、大規模な多次元配列や行列をサポートし、
データサイエンスにおけるデータ分析、科学計算、
機械学習などのさまざまな分野で広く使用されています。
NumPyの使用法は幅広く特徴は以下の通りです。
- 多次元配列
- 数学関数
- 線形代数演算
- 他のライブラリ(Matplotlib,Pandas etc.)との統合
NumPyの使用例は次の通りです。
import numpy as np
# 1次元配列の作成
arr = np.array([1, 2, 3, 4, 5])
# 要素ごとの演算
arr_squared = arr ** 2
arr_sum = np.sum(arr)
print(arr_squared) #-- arrの配列を2乗した値--#
print(arr_sum) #-- arrの合計値 --#
NumPyライブラリをnpとしてインポートします。array関数を使用して1次元配列を作成し、要素ごとの計算を行います。
計算した結果が以下の通りです。
Pythonの出力にはGoogleColaboratoryを使用しました。
Googleアカウントを持っていれば、誰でも無料で使うことができます。
Matplotlib
Matplotlibは、Pythonでデータの可視化やグラフの作成に使用されるライブラリです。
さまざまな形式での静的なプロットやアニメーションを作成するための幅広いツールを提供します。NumPyと同様に、データ分析や科学研究など、さまざまな分野で広く使用されています。
Matplotlibの使用法は幅広く特徴は以下の通りです。
- 関数のプロット
- グラフのカスタマイズ
- 出力形式が多い
- 対話的な可視化
- 他のライブラリ(NumPy,Pandas etc.)との統合
matplotlibの使用例は次の通りです。
import matplotlib.pyplot as plt
# データの準備
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
# 折れ線グラフの作成
plt.plot(x, y)
# グラフの装飾
plt.title('Sample Line Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# グラフの表示
plt.show()
このソースコードを実行すると、以下のようなグラフが出力されます。
NumPyとMatplotlibのグラフ作成
3つのライブラリを使うと混乱してしまうので、
初めにNumPyとMatplotlibでグラフを生成して、
その後ソースコードを修正してTkinterで数値入力できるようにします。
本記事ではsin関数(青)とcos関数(オレンジ)でプロットされます。
ソースコード
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(-5,5,10000)
sin = np.sin(t)
cos = np.cos(t)
plt.plot(t, sin)
plt.plot(t, cos)
plt.grid(True, alpha=0.5)
plt.xlabel('Time t')
plt.ylabel('sin(t)&cos(t)')
plt.savefig("Figure.png")
plt.show()
ブログを運営するメリット
プログラマーがブログを運営するメリットは沢山あります。
エンジニアはブログを運営するべき理由|アリッシア
- アウトプットによるスキル向上
- メモ帳代わり
- ポートフォリオ(案件獲得)
ブログを始めるためには、「テーマ」・「ドメイン」・「サーバー」の3つが必要です。
3つはブログ運営の基盤となる要素ですが、これら全て自分で用意しなければいけません。
面倒で難しくブログ開設を断念してしまう人が多いです。
ConoHa Wingの「WordPressかんたんセットアップ」は
最短10分で契約可能!
ConoHa WINGから契約をすれば、独自ドメイン、サーバーの用意、WordPressとの連携も簡単にできます。
さらに、2つの独自ドメインが永久無料の特典もあり、
月660円からの破格価格にもかかわらず、表示速度は国内最速です。
解説
初めに、numpyとmatplotlibのライブラリをインポートします。
import numpy as np
import matplotlib.pyplot as plt
つづいて、np.linspace()関数を使用して、-5から5までの範囲を10000等間隔の点で区切った配列tを作成します。これはx軸の値に相当します。
t = np.linspace(-5, 5, 10000)
NumPyのnp.sin()関数とnp.cos()関数を使用して、
tの各値に対するsin関数とcos関数の値を計算し、変数sin,cosに代入します。
sin = np.sin(t)
cos = np.cos(t)
plt.plot()関数を使用して、t
をx軸、sinとcosをy軸としてプロットします。
これにより、sin関数とcos関数のグラフが作成されます。
plt.plot(t, sin)
plt.plot(t, cos)
plt.grid()関数を使用して、グリッド線を表示します。alphaパラメータを使用してグリッドの透明度を設定します。
plt.grid(True, alpha=0.5)
plt.xlabel()関数とplt.ylabel()関数を使用して、x軸とy軸のラベルを設定します。
plt.xlabel('Time t')
plt.ylabel('sin(t)&cos(t)')
plt.savefig()関数を使用して、プロットを”Figure.png”という名前のPNG画像ファイルとして保存します。保存場所は本ソースコードを置いてあるところで、デスクトップに保存していれば、このPNG画像もデスクトップに保存されます。
plt.savefig("Figure.png")
最後に、plt.show()関数を使用して、プロットを表示します。
plt.show()
Tkinterでx軸tの範囲を指定
前述したソースコードは-5から5までと入力して範囲を得ていました。
sin関数やcos関数のような周期関数では予測できてしまいますが、
ユーザーがt=7のときの関数を知りたいというとき本コードでは扱いにくいです。
したがって、Tkinterでtの範囲を指定するとそれに応じて値が表示されるコードを作成します。
スライダーを使うと、リアルタイムでグラフの変化が分かります。
ソースコード
import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt
# ウィンドウを作成
root = tk.Tk()
#ウィンドウのサイズ
root.geometry('500x300')
#ウィンドウのタイトル
root.title('Function:sin(t)&cos(t)')
checkbox = tk.BooleanVar()
#テキストボックス無効化
def disable():
if checkbox.get():
txtBox1.configure(state='disabled')
txtBox2.configure(state='disabled')
txtBox3.configure(state='normal')
else:
txtBox1.configure(state='normal')
txtBox2.configure(state='normal')
txtBox3.configure(state='disabled')
#数値取得
def click():
if checkbox.get():
value3= txtBox3.get()
value3= float(value3)
t = np.linspace(-value3, value3, 10000)
else:
value1= txtBox1.get()
value1= float(value1)
value2= txtBox2.get()
value2= float(value2)
t = np.linspace(value1, value2, 10000)
sin = np.sin(t)
cos = np.cos(t)
plt.plot(t, sin)
plt.plot(t, cos)
plt.grid(True, alpha=0.5)
plt.xlabel('Time t')
plt.ylabel('sin(t)&cos(t)')
plt.savefig('sin.png')
plt.show()
#時間範囲:自由
lbl1 = tk.Label(text='Range of Time',font=12)
lbl1.place(x=30, y=50)
txtBox1 = tk.Entry(width=5, font=18)
txtBox1.place(x=30, y=90)
lbl2 = tk.Label(text='~',font=18)
lbl2.place(x=110, y=90)
txtBox2 = tk.Entry(width=5, font=18)
txtBox2.place(x=150, y=90)
#時間範囲:絶対値
chk = tk.Checkbutton(text='±',font=18,variable=checkbox,command=disable)
chk.place(x=300, y=80)
txtBox3 = tk.Entry(width=5,font=18)
txtBox3.place(x=400, y=90)
Btn = tk.Button(text='Go',font=18,command=click)
Btn.pack(side =tk.BOTTOM)
root.mainloop()
解説
先ほどのライブラリに追加してTkinterをインポートします。
import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt
TkinterのTk()関数を使用して、ウィンドウを作成します。geometry()関数を使用してウィンドウのサイズを設定し、title()関数を使用してウィンドウのタイトルを設定します。
root = tk.Tk()
root.geometry('500x300')
root.title('Function:sin(t)&cos(t)')
BooleanVar()関数を使用して、チェックボックスの状態を格納するための変数checkboxを作成します。
checkbox = tk.BooleanVar()
disable()関数は、チェックボックスの状態に応じてテキストボックスの状態を切り替えるための関数です。チェックボックスがチェックされている場合は絶対値範囲のテキストボックスを有効化し、チェックされていない場合は自由範囲のテキストボックスを有効化します。
def disable():
if checkbox.get():
txtBox1.configure(state='disabled')
txtBox2.configure(state='disabled')
txtBox3.configure(state='normal')
else:
txtBox1.configure(state='normal')
txtBox2.configure(state='normal')
txtBox3.configure(state='disabled')
click()関数は、Goボタンがクリックされたときに実行される関数です。
チェックボックスの状態に応じて時間範囲を取得し、
それに基づいてnp.linspace()関数を使用してt
の値を計算します。
そして、sin関数とcos関数の値を計算し、plt.plot()関数でグラフを作成します。
その後、グリッドを表示し、x軸とy軸のラベルを設定、
グラフをPNG画像として保存し、最後にグラフを表示します。
def click():
if checkbox.get():
value3= txtBox3.get()
value3= float(value3)
t = np.linspace(-value3, value3, 10000)
else:
value1= txtBox1.get()
value1= float(value1)
value2= txtBox2.get()
value2= float(value2)
t = np.linspace(value1, value2, 10000)
sin = np.sin(t)
cos = np.cos(t)
plt.plot(t, sin)
plt.plot(t, cos)
plt.grid(True, alpha=0.5)
plt.xlabel('Time t')
plt.ylabel('sin(t)&cos(t)')
plt.savefig('sin.png')
plt.show()
LabelウィジェットとEntryウィジェットを使用して、
自由範囲のラベルとテキストボックスを作成します。
lbl1 = tk.Label(text='Range of Time', font=12)
lbl1.place(x=30, y=50)
txtBox1 = tk.Entry(width=5, font=18)
txtBox1.place(x=30, y=90)
lbl2 = tk.Label(text='~', font=18)
lbl2.place(x=110, y=90)
txtBox2 = tk.Entry(width=5, font=18)
txtBox2.place(x=150, y=90)
CheckbuttonウィジェットとEntryウィジェットを使用して、
絶対値範囲のチェックボックスとテキストボックスを作成します。
chk = tk.Checkbutton(text='±', font=18, variable=checkbox, command=disable)
chk.place(x=300, y=80)
txtBox3 = tk.Entry(width=5, font=18)
txtBox3.place(x=400, y=90)
Buttonウィジェットを使用して、Goボタンを作成します。
ボタンがクリックされたときにclick()関数が呼び出されるように設定されています。
Btn = tk.Button(text='Go', font=18, command=click)
Btn.pack(side=tk.BOTTOM)
ウィンドウを表示し、イベントループを開始します。
root.mainloop()
まとめ
今回は、Tkinterで入力した数値で、定義域を指定して、NumPyとMatplotlibでグラフ作成しました。
Tkinterを用いることで、ユーザーが入力して値を得ることができるようになります。また、関数を扱うときはNumPy、グラフを扱うときはMatplotlibとこれらのライブラリは相性が良く使用頻度が高いです。
Tkinterの標準機能チェックボックスを使うことで、自分でx軸(定義域)の範囲を決めることができます。この時、範囲を絶対値にするか否かは、disableメソッドでユーザーが設定できるようにします。
このように、Pythonのグラフは統計や大学での実験で頻繁に使いますので、
ぜひマスターしてください。
また、Tkinterは、画面遷移をすることが可能です。
画面切り替えを実装すれば、質の高いTkinterアプリを作ることができます。