以前学んだmatplotlibの記事を応用し、「Pythonを使って数学の視覚化をする」シリーズを始めます。今回のテーマは、「一次関数(直線の方程式)」です。紙と鉛筆で描いていたグラフを、プログラミングの力で一瞬で描き出してみましょう。

一次関数(直線の方程式)をプログラムする

一次関数とは、グラフにすると「まっすぐな直線」になる数式のことです。数学の世界では、次のような式で表されます。

$$y = ax + b$$

ここで登場する\(a\)は「傾き(直線の勾配や向き)」を表し、\(b\)は「切片(Y軸と交わるスタート地点)」を表します。

プログラムを使ってこの数式のグラフを描くには、次のような順番で処理を行います。

  • xのデータを用意する: まず、横軸となる「xのデータ」を、例えば-5から5のように複数用意してリストにします。
  • yのデータを計算する: 次に、用意したxの数字を1つずつ取り出し、数式に当てはめて計算することで、対応する「yのデータ」のリストを作ります。
  • グラフを描画する: 最後に、完成したxとyのリストをmatplotlibに渡すことで、点と点が結ばれて1本の直線が描かれます。

では、実際にやってみましょう。
Google Colaboratory (Colab) を開いて新しいノートブックを作成し、\(y = 2x + 1\) のグラフを描画するプログラムを書いてみます。

import matplotlib.pyplot as plt

# xのデータを用意する(-5から5までの整数のリスト)
x_data = list(range(-5, 6))

# yのデータを計算する(内包表記を使って y = 2x + 1 を計算)
y_data = [2 * x + 1 for x in x_data]

# グラフを描画する
plt.plot(x_data, y_data)

# グラフを画面に表示する
plt.show()

とセルに入力して実行してみましょう。すると結果は

のように表示されます。

プログラムの解説(基本の直線グラフ)

  • ライブラリの読み込み(1行目): グラフを描画するためのmatplotlib.pyplotplt という名前で使えるように準備しています。
  • xデータの準備(4行目): range(-5, 6) を使って、-5から5までの数値を生成し、それをlist() でリストに変換して変数x_data に代入しています。
  • yデータの計算(7行目): ここでは以前学習した内包表記を使っています。x_data から数値を1つずつxに取り出し、2 * x + 1 の計算を行います。計算結果が自動的に新しいリストとしてまとまり、変数y_data に代入されます。
  • グラフの描画と表示(10~13行目): plt.plot() に計算したxとyのリストを渡して直線を作成し、plt.show() で画面に表示しています。

傾き(a)と切片(b)を変えて比較する

数式だけを見ていると、「傾き」や「切片」の数字が変わった時にグラフがどう変化するのか、少しピンとこないかもしれません。
しかし、プログラムを使えば複数のグラフを同じ画面に重ねて描画できるため、その違いが一目でわかるようになります。

では、実際にやってみましょう。
Colabの新しいセルに、基準となる\(y = 2x + 1\)に加えて、傾きがマイナスになった\(y = -2x + 1\)と、切片がマイナスになった\(y = 2x – 3\)の3本の直線を同時に描画するプログラムを書いてみます。どの線がどの数式か分かるように、plt.legend() という機能を使って「凡例(ラベル)」も表示します。

import matplotlib.pyplot as plt

# xのデータを用意する
x_data = list(range(-5, 6))

# 3つの異なるyのデータを計算する
y1 = [2 * x + 1 for x in x_data] # 基本の直線
y2 = [-2 * x + 1 for x in x_data] # 傾きがマイナスの直線
y3 = [2 * x - 3 for x in x_data] # 切片がマイナスの直線

# グラフを描画し、それぞれに名前(label)をつける
plt.plot(x_data, y1, label="y = 2x + 1")
plt.plot(x_data, y2, label="y = -2x + 1")
plt.plot(x_data, y3, label="y = 2x - 3")

# 凡例(ラベルの説明)を表示する
plt.legend()

# グラフを画面に描画する
plt.show()

とセルに入力して実行してみましょう。
すると結果は

のように表示されます。

プログラムの解説(複数の直線の比較)

  • 複数のデータの計算(6~9行目): 同じx_data を使って、3種類の異なる計算式でy1,y2,y3という3つのリストを作成しています。
  • ラベル付きで描画(12~14行目): plt.plot() を3回連続で実行することで、3本の線が同じグラフ上に重ねて描かれます。この時、括弧の中にlabel="数式" を追加しておくことで、それぞれの線に名前をつけることができます。
  • 凡例の表示(17行目): plt.legend() を実行すると、先ほど設定したlabel の情報をもとに、「どの色の線がどの数式か」を示す凡例がグラフの中に自動的に配置されます。

グラフを見比べると、傾きをマイナスにすると「右下がり」になり、切片をマイナスにすると「全体が下へ移動する」ことが直感的に理解できるはずです。

[補足1] Colabのフォーム機能で数式を操作してみよう

Colabには、コードの数字を直接書き換えなくても、画面上のスライダーを操作して変数の値を変えられる「フォーム機能」があります。これを使うと、傾きや切片をマウスで動かしながら、グラフがどう変化するのかをインタラクティブ(対話的)に実験することができます。

使い方は簡単で、変数を定義する行の後ろに #@param {type:"slider", min:-5, max:5, step:1} のような特別なコメントを書き足すだけです。

では、実際にやってみましょう。
Colabの新しいセルに、スライダーで傾き(a)と切片(b)を変えられるプログラムを書いてみます。

import matplotlib.pyplot as plt

# スライダーで傾き(a)と切片(b)の値を変更できるフォームを作る
a = 2 #@param {type:"slider", min:-5, max:5, step:1}
b = 1 #@param {type:"slider", min:-5, max:5, step:1}

# xのデータを用意する
x_data = list(range(-5, 6))

# スライダーで決めたaとbを使ってyのデータを計算する
y_data = [a * x + b for x in x_data]

# グラフを描画し、数式をラベルとして表示する
plt.plot(x_data, y_data, label=f"y = {a}x + {b}")

# 凡例(ラベルの説明)を表示する
plt.legend()

# グラフを画面に描画する
plt.show()

とセルに入力してみてください。すると、コードの右側にaとbの数値を操作できるスライダーが自動的に出現します。
スライダーを動かして好きな数字に設定してから実行ボタンを押してみましょう。すると、スライダーで設定した数値に応じた直線グラフが表示されます。

ローカル環境(自分のパソコン)で動かしたい場合

先ほど紹介した #@param を使ったフォーム機能はColab専用の機能です。
そのため、VS Codeなど、自分のパソコン(ローカル環境)のPythonで実行してもスライダーは表示されません。

もし、自分のパソコン上でも同じようにスライダー付きのグラフを動かしたい場合は、matplotlibに標準で用意されているSlider という機能を使います。

注意1

このSliderを使った以下のコードは、パソコンの画面に直接ウィンドウを表示するための機能です。
そのため、ブラウザ上で動くColabで実行してもスライダーは動作しません。Colabで操作したい場合は、先ほどの #@param を使ったコードを利用してください。

注意2

スライダーの文字(「傾き」や「切片」など)を文字化けさせずに日本語で表示させるため、事前にコマンドプロンプトやターミナルで
pip install japanize-matplotlib を実行し、ライブラリをインストールしておいてください。

少しコードは難しくなりますが、以下のように書くことでパソコン上でもインタラクティブなグラフを作ることができます。

# 注意:このコードはColabでは想定の動作はしません
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語表示のために追加
from matplotlib.widgets import Slider # スライダー機能を追加で読み込む

# グラフを描画する画面の準備
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25) # 下の方にスライダーを置くための余白を作る

# xのデータを用意する
x_data = list(range(-5, 6))

# 初期のグラフ (a=2, b=1) のyデータを計算する
y_data = [2 * x + 1 for x in x_data]

# グラフを描画し、後から更新できるように変数 line に入れておく
line, = ax.plot(x_data, y_data, label="y = 2x + 1")
ax.legend()
ax.set_ylim(-15, 15) # グラフが動きやすいようにY軸の範囲を固定しておく

# スライダーを配置する場所(枠)を作る [左, 下, 幅, 高さ]
ax_a = plt.axes([0.25, 0.1, 0.65, 0.03]) # 傾きa用
ax_b = plt.axes([0.25, 0.05, 0.65, 0.03]) # 切片b用

# スライダーを作成 (最小値-5, 最大値5, 初期値, 動く刻み幅)
slider_a = Slider(ax_a, 'a (傾き)', -5.0, 5.0, valinit=2, valstep=1)
slider_b = Slider(ax_b, 'b (切片)', -5.0, 5.0, valinit=1, valstep=1)

# スライダーが動いたときに実行される「更新用の関数」を作る
def update(val):
  a = slider_a.val # スライダーaの現在の数値を取得
  b = slider_b.val # スライダーbの現在の数値を取得

  # 新しいaとbを使ってyのデータを計算し直す
  new_y = [a * x + b for x in x_data]

  # グラフの線とラベルを新しいデータに更新する
  line.set_ydata(new_y)
  line.set_label(f"y = {a}x + {b}")
  ax.legend()
  fig.canvas.draw_idle() # 画面を描き直す

# スライダーが動かされたら、update関数を呼び出すように設定
slider_a.on_changed(update)
slider_b.on_changed(update)

# グラフとスライダーを画面に表示する
plt.show()

プログラムの解説(ローカル環境版)

  • スライダーの準備: matplotlib.widgets から Slider 機能を読み込み、グラフの下に配置するスペースを作っています。
  • 更新用の関数(update): スライダーが動かされるたびにこの関数が呼び出されます。スライダーの現在の数値を読み取り、それを使って新しいy_data を計算し直し、グラフの線を更新するという処理を行っています。

Colabのフォーム機能より複雑ですが、便利な機能です。パソコンにPythonを入れている方はぜひ試してみてください。

[補足2] グラフにグリッド(目盛り線)を表示して見やすくする

グラフを描画したとき、背景が真っ白だと「どの点がどの数値に対応しているのか」が分かりづらいことがあります。
そんな時は、グラフにグリッド(目盛り線)を追加すると、座標の位置関係が見やすくなります。

グリッドを表示するには、plt.plot() などの後に plt.grid(True)という一行を追加するだけです。

では、実際にやってみましょう。グラフにグリッドを追加するコードを書いてみます。

import matplotlib.pyplot as plt

# xのデータを用意する
x_data = list(range(-5, 6))

# yのデータを用意する
y_data = [2 * x + 1 for x in x_data]

# グラフを描画する
plt.plot(x_data, y_data)

# グラフにグリッド(目盛り線)を表示する
plt.grid(True)

# グラフを画面に表示する
plt.show()

とセルに入力して実行してみましょう。すると結果は

のように表示されます。
目盛り線が入るため、それぞれの点がグラフ上のどこにあるかがすぐに分かるようになります。

まとめ

今回は、Pythonとmatplotlibを使って一次関数のグラフを描画し、数学の数式を視覚化する方法について解説しました。

  • グラフを描く仕組み: xのリストを用意し、数式に当てはめてyのリストを計算し、plot()に渡すことで直線が描かれる。
  • 直線の比較: 複数のplot() を連続で実行すれば、グラフを重ね合わせて「傾き」や「切片」の変化を視覚的に比較できる。
  • 見やすさの工夫: plt.grid(True) を使うことで、背景に目盛り線を追加して座標を分かりやすくできる。
  • インタラクティブな操作: Colabでは #@param を、ローカル環境では Slider を使えば、数式とグラフの関係を直感的に理解しやすい。

プログラミングを使うことで、数学がより身近に感じられるようになると思います。ぜひxの範囲を変えたり、全く違う数字を入れたりして、グラフがどう変わるか実験してみてください。

open-in-colab

今回はこれで終了です。
今回のサンプルを用意したので、もし必要な場合は上の「Open in Colab」と書いてあるボタンをクリックしてください。なおそのままだと編集不可なので編集をしたい場合は「ドライブにコピー」をクリックしてコピーしてください。
なおGoogle ColaboratoryについてわからなかったらGoogleColaboratoryを使ってみよう_導入編をご覧ください。

コメントを残す

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

CAPTCHA