1
1

Matplotlib の Slider で任意の時間・角度でプロットする

Posted at

コード

時系列データを任意の時間・角度で指定し、可視化する必要があったため作りました。

slider.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

# インタラクティブ用コマンド
%matplotlib widget

# 変数設定
value = np.linspace(0, 4*np.pi, 1000)
k = np.linspace(0.5, 1.5, 1000)
x = np.sin(value) * k
y = np.cos(value) * k
z = np.linspace(-1, 1, 1000)

# 図形オブジェクト作成
fig = plt.figure(figsize=(8, 8))

# 図形分割
grid = fig.add_gridspec(20, 1)
# スライダー領域確保
ax_slider_z = fig.add_subplot(grid[0,:])        # 方位角
ax_slider_xy = fig.add_subplot(grid[1,:])       # 仰俯角
ax_slider_time = fig.add_subplot(grid[2, :])    # 時間
# 3D 図形領域確保
ax = fig.add_subplot(grid[3:, :], projection="3d")

# Sliderの設定
slider_z = Slider(ax_slider_z, 'z-axis', -180, 180, valinit=0, valstep=10)
slider_xy = Slider(ax_slider_xy, 'xy-axis', -180, 180, valinit=0, valstep=10)
slider_time = Slider(ax_slider_time, "time", 0, 1000, valinit=0, valstep=1)

# 初期視点
ax.view_init(elev=0, azim=0)

# 視点変更のスライダーを動かした時に呼ばれるコールバック関数
def view_change(val):
    # スライダーの値入手
    sz = slider_z.val
    sxy = slider_xy.val

    # 視点変更
    ax.view_init(elev=sxy, azim=sz)
    # 図形の更新
    fig.canvas.draw_idle()

# 時間変更スライダーを動かしたときに呼ばれるコールバック関数
def time_change(val):
    # 前の図形削除
    ax.cla()
    # スライダーの値入手
    pos = slider_time.val
    
    # プロット
    ax.plot(x, y, z)
    ax.set_xlabel("X")
    ax.set_ylabel("Y")
    ax.set_zlabel("Z")
    # 現在地点プロット
    ax.scatter(x[pos], y[pos], z[pos], color="red")

# スライダーにコールバック関数を適応
slider_z.on_changed(view_change)
slider_xy.on_changed(view_change)
slider_time.on_changed(time_change)

# プロット
ax.plot(x, y, z)
ax.scatter(x[0], y[0], z[0], color="red")
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")

plt.show()

結果

環境

VSCode 1.83.1
拡張機能 Jupyter

コードの説明

11/5(日)ごろ公開予定

参考文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1