当前位置: 代码迷 >> python >> 3D Matplotlib图形中图像投影的控制角度
  详细解决方案

3D Matplotlib图形中图像投影的控制角度

热度:22   发布时间:2023-06-13 15:11:23.0

我有一个使用matplotlib绘制的3D图。

我想将3D图投影到特定角度,但是使用axis.view_init(elevation_angle,azimuthal_angle)不能覆盖我想要的角度,这是由于3个维度中只有3个旋转平面以及只有2个角度您可以在matplotlib中指定。

这是一个最小的工作示例。

import numpy,matplotlib,scipy
from matplotlib import pyplot
from scipy import constants
from mpl_toolkits.mplot3d.axes3d import Axes3D

pi=scipy.constants.pi

  w= numpy.arange(0,5000,1)


def lorentzian(x,center,width,time,tau):
    return 1.0/((1+((x-center)/width)**2)*width*pi)*numpy.exp(-time/tau)

centers= [1000.0,2000.0,4000.0]
widths = [100.0,300.0,50.0]

taus=numpy.zeros(len(widths))

for i in xrange(0,len(widths),1):
    taus[i] = 1.0/widths[i]

time = numpy.array([0,0.019,0.033])
B = numpy.zeros((3,len(w)))
for z in xrange(0,len(time),1):
    a= numpy.zeros(len(w))
    for i in xrange(0,len(centers),1):
        a = a + lorentzian(w,centers[i],widths[i],time[z],taus[i])

    B[z] = a

ThreeD_spectrum_figure = matplotlib.pyplot.figure()
ThreeD_spectrum_axis = ThreeD_spectrum_figure.add_subplot(111, projection="3d")

colour = ["purple","green","orange"]
for i in xrange(0,len(time),1):
    ThreeD_spectrum_axis.plot(w, B[i],time[i],color=colour[i],linewidth=3)

ThreeD_spectrum_axis.view_init( 135,-90)
matplotlib.pyplot.show()

这将生成下图所示的图形,我匆匆忙忙地在ms画图中添加了几行来显示旋转和轴。

红色表示绕Y轴旋转的方位角的角度控制。

蓝色显示仰角,绕X轴旋转。

黑色显示我需要的旋转,它将绕Z轴旋转,使用axis.view_init(elevation_angle,azimuth_angle)无法实现。

谁能提供任何帮助或见解以了解如何实现这种轮换? 谢谢

仅使用方位角即可实现围绕z轴的旋转。

import numpy as np
import matplotlib.animation
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D

pi=np.pi
w= np.arange(0,5000,1)

def lorentzian(x,center,width,time,tau):
    return 1.0/((1+((x-center)/width)**2)*width*pi)*np.exp(-time/tau)

centers= [1000.0,2000.0,4000.0]
widths = [100.0,300.0,50.0]

taus=np.zeros(len(widths))

for i in xrange(0,len(widths),1):
    taus[i] = 1.0/widths[i]

time = np.array([0,0.019,0.033])
B = np.zeros((3,len(w)))
for z in xrange(0,len(time),1):
    a= np.zeros(len(w))
    for i in xrange(0,len(centers),1):
        a = a + lorentzian(w,centers[i],widths[i],time[z],taus[i])
    B[z] = a

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")

colour = ["purple","green","orange"]
for i in xrange(len(time)-1,-1,-1):
    ax.plot(time[i]*np.ones_like(w), w ,B[i]*np.ones_like(w),color=colour[i],linewidth=3)

ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

#(elev, azim)
ax.view_init(45,0)

phi = np.linspace(0, 2*np.pi)

def update(phi):
    ax.view_init(45, phi*180./np.pi)

ani = matplotlib.animation.FuncAnimation(fig, update, frames=phi)
ani.save(__file__+".gif", writer='imagemagick', fps=10)
plt.show()