コード
時系列データを任意の時間・角度で指定し、可視化する必要があったため作りました。
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(日)ごろ公開予定
参考文献