3D matplotlib 图中图像投影的控制角度
Control angle of image projection in 3D matplotlib graphs
我有一个使用 matplotlib 绘制的 3D 图形。
我想以特定角度投影 3D 图,但使用
axis.view_init(elevation_angle, azimuthal_angle) 没有覆盖我想要的角度,这是因为在 3 个维度上有 3 个可能的旋转平面,而您只能在 matplotlib 中指定 2 个角度.
这是一个最小的工作示例。
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 paint 中匆忙添加了线条来显示旋转和轴。
红色表示方位角的角度控制,绕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()
我有一个使用 matplotlib 绘制的 3D 图形。
我想以特定角度投影 3D 图,但使用 axis.view_init(elevation_angle, azimuthal_angle) 没有覆盖我想要的角度,这是因为在 3 个维度上有 3 个可能的旋转平面,而您只能在 matplotlib 中指定 2 个角度.
这是一个最小的工作示例。
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 paint 中匆忙添加了线条来显示旋转和轴。
红色表示方位角的角度控制,绕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()