【Python】MatplotlibとNumPyで数式に基づいた関数のグラフを描画する

目次

概要

Pythonで数学的な関数のグラフを描くためのレシピです。 手動で点データを入力するのではなく、NumPyを用いて定義域(X軸)の配列を生成し、数式をそのままコードに落とし込んで計算させることで、滑らかな曲線を効率的に描画します。

仕様(入出力)

  • 入力: 定義域の範囲(開始点・終了点・分割数)、描画したい数式
  • 出力: 数式を可視化したグラフ(ウィンドウ表示または画像保存)
  • 要件: matplotlib および numpy がインストールされていること

基本の使い方

import matplotlib.pyplot as plt
import numpy as np

# -10から10までを100分割したX軸データを作成
x = np.linspace(-10, 10, 100)
# 数式通りに計算(配列の全要素に適用される)
y = x ** 2 + 5

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

コード全文

ここでは、三次関数と三角関数(サイン波)を計算し、同一のグラフ上にプロットして比較するコードを提示します。

import matplotlib.pyplot as plt
import numpy as np

def main():
    # 1. 定義域(X軸)の生成
    # -2π から 2π までの範囲を 200分割
    x = np.linspace(-2 * np.pi, 2 * np.pi, 200)

    # 2. 関数値(Y軸)の計算
    # NumPy配列同士の演算は要素ごとに行われる(ブロードキャスト)
    
    # 関数A: 三次関数 (係数でスケーリング)
    y1 = 0.1 * x ** 3 - x
    
    # 関数B: 三角関数 (サイン波)
    y2 = 3 * np.sin(x)

    # 3. グラフのセットアップ
    fig, ax = plt.subplots(figsize=(8, 5))

    # 4. プロットとスタイルの指定
    ax.plot(x, y1, label="Cubic Function", color="#1f77b4", linewidth=2)
    ax.plot(x, y2, label="Sine Wave", color="#ff7f0e", linestyle="--", linewidth=2)

    # 5. グラフの装飾
    ax.set_title("Function Comparison")
    ax.set_xlabel("x")
    ax.set_ylabel("f(x)")
    
    # 軸線(原点)の強調
    ax.axhline(0, color='gray', linewidth=0.8)
    ax.axvline(0, color='gray', linewidth=0.8)
    
    ax.grid(True, linestyle=":", alpha=0.6)
    ax.legend() # 凡例を表示

    # 描画実行
    plt.show()

if __name__ == "__main__":
    main()

カスタムポイント

  • np.linspace(start, stop, num) グラフ描画において最も重要な関数です。num(分割数)が少ないとカクカクした折れ線になるため、滑らかな曲線を書きたい場合は 100200 などの十分な値を指定してください。
  • 軸の表示 (axhline, axvline) 数学関数のグラフでは、グラフの枠線だけでなく、原点 (0, 0) を通るX軸・Y軸があったほうが見やすい場合があります。上記コードのように色や太さを指定して追加できます。
  • 数式の記述 np.sin(), np.cos(), np.exp() (指数関数), np.log() (対数関数) など、NumPyには主要な数学関数が揃っています。これらは配列を受け取り、配列を返します。

注意点

  1. 標準ライブラリ math との混同 import mathmath.sin(x) は、リストや配列を直接受け取れません(エラーになります)。グラフ描画のために配列を扱う際は、必ず numpy.sin(x) などのNumPy関数を使用してください。
  2. 定義域の範囲外 np.log(x)np.sqrt(x) を描画する際、x に負の値が含まれていると nan(非数)が発生し、その部分は描画されません。関数の定義域に合わせて linspace の範囲を調整する必要があります。
  3. 属性名のタイプミス NumPyやMatplotlibの関数名は似たものが多いため注意が必要です(例: siz ではなく sinlinespace ではなく linspace)。

バリエーション(任意)

パラメトリック曲線(円の描画)

XとYを独立した関数として定義することで、円や渦巻きなどの媒介変数表示のグラフも作成できます。

import matplotlib.pyplot as plt
import numpy as np

def draw_circle():
    # 角度 theta を 0 から 2π まで生成
    theta = np.linspace(0, 2 * np.pi, 100)
    
    # 円の方程式: x = r * cos(θ), y = r * sin(θ)
    radius = 5
    x = radius * np.cos(theta)
    y = radius * np.sin(theta)

    fig, ax = plt.subplots()
    ax.plot(x, y)
    
    # アスペクト比を1:1にして円が楕円にならないようにする
    ax.set_aspect('equal')
    ax.grid(True)
    ax.set_title("Parametric Plot (Circle)")
    
    plt.show()

if __name__ == "__main__":
    draw_circle()

まとめ

数式からグラフを作成する際は、NumPyの配列操作を活用することで、ループ処理を書くことなく簡潔にコードを記述できます。 np.linspace で解像度を決め、plt.subplots で描画領域を作るという基本フローを押さえておけば、あらゆる数学関数の可視化に応用可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次