
まくまく
ChatGPTとPythonの相性が良すぎですね。今回はアニメーション付きのベクトル場グラフを作成してもらいました。
Step1: matplotlibでグラフを作成
まずはChatGPTにグラフを作成してもらいます。以下の文章をChatGPTに入力します。

まくまく
mesfgridを利用して2×2の格子を作成して、その中心に点をプロットするグラフを作成してください。
import matplotlib.pyplot as plt
import numpy as np
# 2x2の格子を作成
x, y = np.meshgrid([-1, 1], [-1, 1])
# プロットする点の座標
x_point, y_point = [0], [0]
# グラフを作成
plt.figure()
# 格子線をプロット
plt.plot(x, y, 'o', color='black')
# 点をプロット
plt.plot(x_point, y_point, 'o', color='red')
# グラフの軸ラベルを設定
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# グラフのタイトルを設定
plt.title('2x2 grid with a point at the center')
# グラフを表示
plt.show()
ChatGPTによって上のコードが書かれました。実行してみましょう。
中央の赤い点だけをプロットしてほしかったのですが、それぞれの格子の中心に点がプロットされました。うまく入力しないとこのあたりは意図した通りになりませんね。改めて入力文を確認すると、確かにあいまいかもしれません。
入力文:mesfgridを利用して2×2の格子を作成して、その中心に点をプロットするグラフを作成してください。
Step2: ベクトルを表示
次に以下のように入力してベクトル(矢印)を表示してもらいましょう。

まくまく
中心点を始点とするベクトルをひとつ表示させてください
import matplotlib.pyplot as plt
import numpy as np
# 2x2の格子を作成
x, y = np.meshgrid([-1, 1], [-1, 1])
# プロットする点の座標
x_point, y_point = [0], [0]
# グラフを作成
plt.figure()
# 格子線をプロット
plt.plot(x, y, 'o', color='black')
# 点をプロット
plt.plot(x_point, y_point, 'o', color='red')
# 中心点の座標
center_x, center_y = 0, 0
# ベクトルの方向を示す座標
vector_x, vector_y = 1, 0
# 中心点からベクトルの方向に伸びる線分をプロット
plt.arrow(center_x, center_y, vector_x, vector_y, head_width=0.1, head_length=0.2, color='blue')
# グラフの軸ラベルを設定
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# グラフのタイトルを設定
plt.title('2x2 grid with a point at the center and a vector')
# グラフを表示
plt.show()
方向やベクトルの大きさは何も指定していなくても、このようなベクトルを作成してくれました。
Step3: ベクトルをアニメーションで動かそう
最後はこのベクトルを動かしてみようと思います。

まくまく
ベクトルを回転させるアニメーションを作成して、そのグラフをgifで書き出してください
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# フィギュアを作成
fig, ax = plt.subplots()
# 軸の範囲を設定
ax.set_xlim([-2, 2])
ax.set_ylim([-2, 2])
# 始点となるベクトルを描画
v = np.array([1, 0])
q = ax.quiver(0, 0, v[0], v[1], color='r', angles='xy', scale_units='xy', scale=1)
# 回転角度を初期化
angle = 0
# アニメーションフレームの更新用関数
def update(frame):
global angle, v
# ベクトルを回転
angle += 0.1
R = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]])
v = R @ v
# ベクトルを描画
q.set_UVC(v[0], v[1])
# 描画オブジェクトを返す
return q,
# アニメーションを作成
anim = FuncAnimation(fig, update, frames=np.arange(0, 20), interval=50)
anim.save("ani.gif", writer="pillow")
# アニメーションを表示
plt.show()
いい感じ?に回転させてくれましたね。今回かなりざっくりとした入力でしたが、もっと具体的に記載すると意図した動きになると思います。