Python ChatGPT活用 アニメーション付きのグラフを作成してもらった

まくまく
まくまく
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()

いい感じ?に回転させてくれましたね。今回かなりざっくりとした入力でしたが、もっと具体的に記載すると意図した動きになると思います。

タイトルとURLをコピーしました