【Python】x軸の範囲を自由自在に決められるグラフ作成アプリ

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと次のようなプログラミングができるようになります

ウィンドウ(Tkinter)で入力した範囲(定義域)のグラフを作成する。

Pythonは拡張性が高く、コードが非常にシンプルで書けて、アプリ開発人工知能までを網羅しているため、初心者から上級者まで幅広く愛させているプログラミング言語です。

特に理系の方はプログラミングでグラフをプロットすることが度々あり、Pythonで作成する方も多いかと思います。

本記事では、ユーザーが入力した数値に応じて、グラフをプロットする方法を紹介します。

統計学で役に立つPythonのライブラリをまとめました。あわせてご覧ください。

本記事は次の人におすすめ
  • Pythonでグラフを作れるようになりたい人
  • Tkinter、NumPy、Matplotlibのモジュールについて知りたい
スポンサーリンク

Tkinter

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標準搭載のボタン・ラベルの使い方をまとめています。あわせてご覧ください。

ただし、Tkinterの機能は、基本的なGUIアプリケーションやプロトタイプ作成には十分ですが、高度なGUI制作には不向きです。

NumPy

numpy

NumPyは、Numerical(数値) Pythonの略で、数値計算に使用されるPythonライブラリです。NumPyは、大規模な多次元配列や行列をサポートするため、データサイエンスにおけるデータ分析、科学計算、機械学習などのさまざまな分野で広く使用されています。

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

Matplotlibは、Pythonでデータの可視化やグラフの作成に使用されるライブラリです。さまざまな形式での静的なプロットやアニメーションを作成するための幅広いツールを提供します。NumPyと同様に、データ分析や科学研究など、さまざまな分野で広く使用されています。

Matplotlibの使用法は幅広く特徴は以下の通りです。

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()

Pythonの学習進め方

Pythonでできることは多岐に渡ります。

Pythonでできること
  • 機械学習・人工知能
  • データ解析・統計分析
  • ファイル操作・システム管理
  • GUIアプリ開発

Pythonは強力で柔軟なプログラミング言語ですが、常に情報がアップデートされるので、
新しいライブラリやフレームワークを独学で学び続けることは困難です。

Udemyは動画で目的に応じた講座を受講できるのでレベルを合わせて学習できます。
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで独学できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Pythonでデータサイエンスや人工知能、GUIを学びたい人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を5つ紹介します。

Pythonをインストールから環境設定、基本文法が学習できる。さらに、モジュールの使い方やファイル操作の他に暗号化、並列化、インフラ自動化、キューイングシステム、非同期処理についても学べます。

Pythonの基礎を押さえつつ、人口知能やニューラルネットワーク、機械学習を取り扱う。機械学習ライブラリで文字認識や株価分析などを行う。

データサイエンティストになるために必要なツールについて学ぶことができる。統計分析、NumpyやPandasなどを使ったPythonのプログラミング、機械学習の実装、ディープラーニングの実装を学習できる。

PythonでGUIを作成する方法を取り扱う。Tkinterの発展的な操作まで学習できる。翻訳アプリ、家計簿アプリ、電卓アプリ、音楽再生アプリなど作成して、exeファイル化する。

解説

初めに、numpymatplotlibのライブラリをインポートします。

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軸、sincosを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アプリを作ることができます。

この記事を書いた人

プロフィール

アリッシア

                 

大学4年間で何か胸を張れるスキルを身に着けたくて当サイト運営を始めました。
現在、大学院に進学するか就職するか迷いながら勉強しています。
詳しいプロフィールはこちら

Contact icon

contact

X icon

X

Instagram icon

Instagram

Note icon

Note

スポンサーリンク
Python
フォローする
タイトルとURLをコピーしました