目次
概要
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(分割数)が少ないとカクカクした折れ線になるため、滑らかな曲線を書きたい場合は100や200などの十分な値を指定してください。- 軸の表示 (
axhline,axvline) 数学関数のグラフでは、グラフの枠線だけでなく、原点(0, 0)を通るX軸・Y軸があったほうが見やすい場合があります。上記コードのように色や太さを指定して追加できます。 - 数式の記述
np.sin(),np.cos(),np.exp()(指数関数),np.log()(対数関数) など、NumPyには主要な数学関数が揃っています。これらは配列を受け取り、配列を返します。
注意点
- 標準ライブラリ
mathとの混同import mathのmath.sin(x)は、リストや配列を直接受け取れません(エラーになります)。グラフ描画のために配列を扱う際は、必ずnumpy.sin(x)などのNumPy関数を使用してください。 - 定義域の範囲外
np.log(x)やnp.sqrt(x)を描画する際、xに負の値が含まれているとnan(非数)が発生し、その部分は描画されません。関数の定義域に合わせてlinspaceの範囲を調整する必要があります。 - 属性名のタイプミス NumPyやMatplotlibの関数名は似たものが多いため注意が必要です(例:
sizではなくsin、linespaceではなく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 で描画領域を作るという基本フローを押さえておけば、あらゆる数学関数の可視化に応用可能です。
