Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

ax.view_initを調節して3Dオブジェクトを横に回すGIFをつくる

投稿日:







以前書いた、好きな画像で3Dプロットをする方法を書いたのですが、
縦回ししかしなかったのでax.view_initを調節して横回しする方法を考えました。

スポンサーリンク

ax.view_initとは?

matplotlibさん公式(最後の見出しにURL記載)によると・・・

view_init(elev=None, azim=None)

Set the elevation and azimuth of the axes.

This can be used to rotate the axes programatically.

‘elev’ stores the elevation angle in the z plane. ‘azim’ stores the azimuth angle in the x,y plane.

if elev or azim are None (default), then the initial value is used which was specified in the Axes3D constructor.

つまり、elevはZ軸の仰角を表しazimはX,Yの方位角を表すということです。

縦回しをする方法は?

Z軸の仰角elevを調節すればよいだけなので、

for  mes in range(0, 90, 10):
      ax.view_init(elev=mes, azim=0)
  

とすると、縦に回ります。縦回しにしたときの Pythonコードは以前の記事にあるのでそちらを参照してください。

Pythonで好きな画像を球に張り付ける!

スポンサーリンク

横に回す方法

今度はazimを変更します。以下のように設定しました。

for  mes in range(-360, 0, 30):
  	ax.view_init(elev=20, azim=mes)
  

azimを低下させると反時計回りに回転、増加させると時計回りになるみたいです。

横回しのサンプルコードを置いておきますので、気になったかたはお試しください。

#!/usr/bin/env python3

#必要なものを宣言
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from PIL import Image, ImageFilter
import numpy as np

#解像度の指定
set_dpi = 100

#できたpngファイルを入れる場所を指定
#たくさんのpngを保存するので、新しくディレクトリを作った方がよい
DIR1 = '/home/User/3D_plot/figs/'

#球の半径
radius = 15

#ここから作図
fig = plt.figure(figsize=(6,6))

ax = fig.add_subplot( 111 , projection='3d')


#グリットの最大値。radius<rmasにすること
rmax = 24
ax.set_xlim(-rmax,rmax)
ax.set_ylim(-rmax,rmax)
ax.set_zlim(-rmax,rmax)


#画像の読み込み
img = Image.open('artboard.png')

#RGBに変換。jpgの場合は必要なし
img = img.convert("RGB")

#RGBの範囲は0~1の値をとるため、256で割る作業をする。
mm = np.array(img)/256.


#緯度経度の指定
long = np.linspace(0, 2*np.pi, mm.shape[1])
lat = np.linspace(-0.5*np.pi, 0.5*np.pi, mm.shape[0])[::-1]

lat2, long2 = np.meshgrid(lat, long)

X = (radius*np.cos(lat2)*np.cos(long2)).T
Y = (radius*np.cos(lat2)*np.sin(long2)).T
Z = (radius*np.sin(lat2)).T

#forループ内にsurfaceをおくと、遅くなるので注意
ax.plot_surface(X, Y, Z, facecolors = mm, shade=False, rstride=7, cstride=7)

#ax.view_initの位置をmesで変化させることで、球が回る仕組み
for  mes in range(-360, 0, 30):
	ax.view_init(elev=20, azim=mes)

	#軸、グリットの削除
	ax._axis3don = False

	#pngで保存
	fileo1 = DIR1 +'3dplot_' + str(mes) +'.png'
	plt.savefig(fileo1,dpi=set_dpi)




参考にしたサイト様

matplotlib公式

https://matplotlib.org/mpl_toolkits/mplot3d/api.html

-Python

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.