NumPy arctanで描画!Pythonで美しい図形を描く方法:数学とコードで創造性を解き放つ
Pythonの数値計算ライブラリNumPyは、その強力な配列操作と数学関数によって、データ分析だけでなく、美しい図形を描画するための強力なツールとしても利用できます。中でも、arctan
(逆正接関数)は、角度を計算し、円や螺旋、さらに複雑な模様を描画する上で非常に重要な役割を果たします。
この記事では、NumPyのarctan
関数を深く掘り下げ、それを活用してPythonで様々な図形を描画する方法を、具体的なコード例を交えながら詳細に解説します。数学的な基礎から応用的な描画テクニックまでを網羅し、読者がNumPyとarctan
を使って創造的な図形を描画できるようになることを目指します。
1. arctan
関数とは?逆三角関数の基礎
arctan
は、逆正接関数またはアークタンジェントと呼ばれ、与えられた値に対する角度をラジアンで返します。これは、三角関数である正接(tan)の逆関数であり、正接の値から角度を求めるために使用されます。
数学的な定義:
arctan(x) = θ
は、tan(θ) = x
を満たすθ
を意味します。
NumPyにおけるarctan
関数:
NumPyは、numpy.arctan()
関数を提供しており、これを使うことで簡単にarctan
を計算できます。
“`python
import numpy as np
x = 1.0
angle_radians = np.arctan(x) # 結果はラジアン
angle_degrees = np.degrees(angle_radians) # ラジアンを角度に変換
print(f”arctan({x}) = {angle_radians:.4f} ラジアン”) # arctan(1.0) = 0.7854 ラジアン
print(f”arctan({x}) = {angle_degrees:.4f} 度”) # arctan(1.0) = 45.0000 度
“`
arctan
の引数と戻り値:
- 引数:
numpy.arctan()
関数は、任意の数値(スカラー値またはNumPy配列)を引数として受け取ります。 - 戻り値: 引数に対応する
arctan
の値(ラジアン)を返します。引数が配列の場合、同じ形状の配列が返されます。
arctan2
関数: より正確な角度計算
arctan
には、arctan2
という非常に便利な仲間がいます。 arctan2(y, x)
は、y/x
の arctan
を計算しますが、x
と y
の符号を考慮して、適切な象限の角度を返します。これは、原点からの相対的な位置に基づいて角度を正確に計算する場合に非常に役立ちます。
“`python
import numpy as np
x = -1.0
y = 1.0
angle_radians = np.arctan2(y, x) # y/x の arctan, 符号を考慮
angle_degrees = np.degrees(angle_radians)
print(f”arctan2({y}, {x}) = {angle_radians:.4f} ラジアン”) # arctan2(1.0, -1.0) = 2.3562 ラジアン
print(f”arctan2({y}, {x}) = {angle_degrees:.4f} 度”) # arctan2(1.0, -1.0) = 135.0000 度
“`
arctan
とarctan2
の使い分け:
arctan(x)
:x
の値だけに基づいて角度を計算します。-π/2 から π/2 の範囲の角度を返します。arctan2(y, x)
:x
とy
の値に基づいて角度を計算し、適切な象限を考慮します。-π から π の範囲の角度を返します。
arctan2
は、座標に基づいて角度を計算する場合、特に原点に対する点の位置を表現する場合に非常に便利です。
2. Matplotlibによる基本的な描画
arctan
で計算した角度を使って図形を描画するには、Pythonの描画ライブラリであるMatplotlibを使用します。Matplotlibは、グラフや図を簡単に作成できる強力なライブラリです。
Matplotlibのインストール:
まだインストールしていない場合は、以下のコマンドでMatplotlibをインストールできます。
bash
pip install matplotlib
基本的な描画手順:
-
Matplotlibのインポート:
python
import matplotlib.pyplot as plt
import numpy as np -
データの準備:
描画するデータの座標(x, y)をNumPy配列で準備します。
arctan
を使って角度を計算し、その角度に基づいて座標を生成することもできます。 -
プロット:
plt.plot(x, y)
またはplt.scatter(x, y)
などの関数を使って、データをプロットします。plt.plot()
は線で点を結び、plt.scatter()
は点を描画します。 -
表示:
plt.show()
関数を使って、描画した図を表示します。
簡単な例: 直線を描画する
“`python
import matplotlib.pyplot as plt
import numpy as np
x座標のデータ
x = np.linspace(0, 10, 100) # 0から10までの100個の等間隔な点
y座標のデータ (y = x)
y = x
プロット
plt.plot(x, y)
タイトルとラベル
plt.title(“Linear Plot”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
点を描画する例:
“`python
import matplotlib.pyplot as plt
import numpy as np
x座標とy座標のデータ
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 1, 3, 5])
スキャッタープロット
plt.scatter(x, y)
タイトルとラベル
plt.title(“Scatter Plot”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
3. arctan
を使った基本的な図形の描画
arctan
を使って円、螺旋、その他の図形を描画する方法を説明します。
3.1 円の描画:
円は、極座標(r, θ)を使って簡単に表現できます。arctan2
を使って、原点からの角度θ
を計算し、円周上の点の座標(x, y)を計算します。
“`python
import matplotlib.pyplot as plt
import numpy as np
円の中心座標
center_x = 0
center_y = 0
円の半径
radius = 5
角度の範囲 (0から2πまで)
theta = np.linspace(0, 2*np.pi, 100)
x座標とy座標の計算
x = radius * np.cos(theta) + center_x
y = radius * np.sin(theta) + center_y
プロット
plt.plot(x, y)
アスペクト比を調整して円を正円にする
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Circle”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
解説:
np.linspace(0, 2*np.pi, 100)
は、0から2πまでの100個の等間隔な角度を生成します。x = radius * np.cos(theta) + center_x
とy = radius * np.sin(theta) + center_y
は、極座標(radius, theta)から直交座標(x, y)に変換する式です。plt.gca().set_aspect('equal', adjustable='box')
は、アスペクト比を調整して円を正円に見せるための重要な処理です。
arctan2
を使った円の描画(中心からの相対角度計算):
“`python
import matplotlib.pyplot as plt
import numpy as np
円の中心座標
center_x = 0
center_y = 0
円の半径
radius = 5
x座標とy座標の範囲
x = np.linspace(-radius, radius, 100)
y = np.linspace(-radius, radius, 100)
メッシュグリッドの作成
X, Y = np.meshgrid(x, y)
中心からの距離を計算
distance = np.sqrt((X – center_x)2 + (Y – center_y)2)
半径内の点だけを円周上の点とする (距離が半径に近い点)
mask = np.abs(distance – radius) < 0.1
円周上の点のx座標とy座標
x_circle = X[mask]
y_circle = Y[mask]
プロット
plt.scatter(x_circle, y_circle, s=1) # s は点のサイズ
アスペクト比を調整して円を正円にする
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Circle (using arctan2)”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
この例では、arctan2
は直接使用していませんが、中心からの距離を計算し、半径に近い点を選択することで、円を描画しています。この方法は、複雑な形状の一部として円を描画する場合に役立ちます。
3.2 螺旋の描画:
螺旋は、角度θ
に比例して半径が変化する極座標で表現できます。
“`python
import matplotlib.pyplot as plt
import numpy as np
螺旋のパラメータ
a = 1.0 # 定数
角度の範囲
theta = np.linspace(0, 10*np.pi, 500) # 0から10πまでの角度
半径の計算
r = a * theta
x座標とy座標の計算
x = r * np.cos(theta)
y = r * np.sin(theta)
プロット
plt.plot(x, y)
アスペクト比を調整
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Spiral”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
解説:
r = a * theta
は、角度θ
に比例して半径r
が変化する螺旋の式です。a
は螺旋の広がり具合を制御するパラメータです。
arctan2
を使った螺旋の描画:
arctan2
は、螺旋の向きや回転を制御するのに役立ちます。例えば、中心から離れるにつれて色が変わる螺旋を描画できます。
“`python
import matplotlib.pyplot as plt
import numpy as np
螺旋のパラメータ
a = 0.1 # 定数
x座標とy座標の範囲
x = np.linspace(-20, 20, 500)
y = np.linspace(-20, 20, 500)
メッシュグリッドの作成
X, Y = np.meshgrid(x, y)
arctan2で角度を計算
theta = np.arctan2(Y, X)
半径を計算
r = a * theta
x座標とy座標の計算 (極座標から直交座標へ)
x_spiral = r * np.cos(theta)
y_spiral = r * np.sin(theta)
色付けのための値 (角度)
colors = theta
プロット
plt.scatter(x_spiral, y_spiral, c=colors, cmap=’viridis’, s=5) # c=colors で色を指定, cmapでカラーマップを指定
アスペクト比を調整
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Spiral (using arctan2 with color)”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
カラーバーの表示
plt.colorbar(label=”Angle (radians)”)
図の表示
plt.show()
“`
この例では、arctan2
を使って各点の角度を計算し、その角度を色の値として使用しています。これにより、中心から離れるにつれて色が変化する美しい螺旋を描画できます。
4. より複雑な図形の描画
arctan
とMatplotlibを使って、より複雑な図形を描画してみましょう。
4.1 リサジュー図形:
リサジュー図形は、異なる周波数の正弦波を組み合わせることで生成される図形です。
“`python
import matplotlib.pyplot as plt
import numpy as np
リサジュー図形のパラメータ
a = 5.0
b = 3.0
delta = np.pi/2 # 位相差
時間の範囲
t = np.linspace(0, 2*np.pi, 500)
x座標とy座標の計算
x = np.sin(at + delta)
y = np.sin(bt)
プロット
plt.plot(x, y)
アスペクト比を調整
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Lissajous Figure”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
arctan2
と組み合わせたリサジュー図形の変形:
arctan2
を使って、リサジュー図形の形状を制御することもできます。例えば、各点の角度に基づいて半径を変化させることで、より複雑な形状を作成できます。
“`python
import matplotlib.pyplot as plt
import numpy as np
リサジュー図形のパラメータ
a = 5.0
b = 3.0
delta = np.pi/2 # 位相差
時間の範囲
t = np.linspace(0, 2*np.pi, 500)
x座標とy座標の計算
x = np.sin(at + delta)
y = np.sin(bt)
arctan2で角度を計算
theta = np.arctan2(y, x)
半径を角度に基づいて変化させる
r = 1 + 0.5 * np.cos(3 * theta) # 例: 角度の3倍のコサイン
変形されたx座標とy座標
x_modified = r * x
y_modified = r * y
プロット
plt.plot(x_modified, y_modified)
アスペクト比を調整
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Modified Lissajous Figure (using arctan2)”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
4.2 花びら模様:
arctan
を使って、花びらのような複雑な模様を描画できます。
“`python
import matplotlib.pyplot as plt
import numpy as np
角度の範囲
theta = np.linspace(0, 2*np.pi, 500)
花びらの数
n = 5
半径を計算 (花びら状のパターン)
r = np.cos(n * theta)
x座標とy座標の計算
x = r * np.cos(theta)
y = r * np.sin(theta)
プロット
plt.plot(x, y)
アスペクト比を調整
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Rose Curve”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
グリッドの表示
plt.grid(True)
図の表示
plt.show()
“`
解説:
r = np.cos(n * theta)
は、花びら状のパターンを生成する式です。n
は花びらの数を制御するパラメータです。
arctan2
を活用した花びらの色付け:
“`python
import matplotlib.pyplot as plt
import numpy as np
角度の範囲
theta = np.linspace(0, 2*np.pi, 500)
花びらの数
n = 5
半径を計算 (花びら状のパターン)
r = np.cos(n * theta)
x座標とy座標の計算
x = r * np.cos(theta)
y = r * np.sin(theta)
arctan2で角度を計算
angles = np.arctan2(y, x)
プロット (色付け)
plt.scatter(x, y, c=angles, cmap=’hsv’, s=10) # c=angles で色を指定, cmapでカラーマップを指定
アスペクト比を調整
plt.gca().set_aspect(‘equal’, adjustable=’box’)
タイトルとラベル
plt.title(“Rose Curve (Colored by Angle)”)
plt.xlabel(“x-axis”)
plt.ylabel(“y-axis”)
カラーバーの表示
plt.colorbar(label=”Angle (radians)”)
図の表示
plt.show()
“`
この例では、arctan2
を使って各点の角度を計算し、その角度を色として使用することで、花びら模様に色を付けることができます。
5. アニメーションによる表現
Matplotlibを使って、arctan
で制御された図形のアニメーションを作成することができます。
“`python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
初期設定
fig, ax = plt.subplots()
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
line, = ax.plot([], [], lw=2)
アニメーション関数
def animate(i):
# 角度を時間とともに変化させる
theta = np.linspace(0, 2*np.pi, 100) + i/10.0
# 半径を計算
r = 5 + 2np.sin(5theta) # 例:花びら状のパターン
# x座標とy座標を計算
x = r * np.cos(theta)
y = r * np.sin(theta)
line.set_data(x, y)
return line,
アニメーションの作成
ani = FuncAnimation(fig, animate, frames=200, blit=True, repeat=True)
アニメーションの表示
plt.show()
“`
解説:
FuncAnimation
は、アニメーションを作成するための関数です。animate(i)
は、各フレームで実行される関数で、図形を更新します。i
はフレーム番号です。
6. まとめ:arctan
で広がる図形描画の可能性
この記事では、NumPyのarctan
関数を深く掘り下げ、Matplotlibと組み合わせて様々な図形を描画する方法を解説しました。
arctan
とarctan2
の違いと使い分け- 円、螺旋、リサジュー図形、花びら模様などの描画
arctan2
を使った色の制御- アニメーションによる表現
arctan
は、単なる逆三角関数ではなく、角度を制御し、複雑な図形を生成するための強力なツールです。この記事で紹介したテクニックを応用することで、さらに創造的な図形を描画することができます。
今後の学習:
- フラクタル図形を描画する
- 3Dプロットで
arctan
を使用する - 画像処理で
arctan
を活用する
arctan
は、数学とプログラミングの知識を組み合わせることで、無限の可能性を秘めたツールです。この記事が、読者の皆様がarctan
を使って創造性を解き放ち、美しい図形を描画するための一助となれば幸いです。