2017-02-13 17 views
1

У меня есть 3D-график, построенный с использованием matplotlib.Угол управления проекцией изображения в 3D графиках matplotlib

Я хотел бы иметь 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() 

Это будет генерировать график, показанный на рисунке ниже, где я, поспешно мс краской, добавляют линии, чтобы показать вращение и ось.

Красный показывает угол управления азимутом, вращающимся вокруг оси Y.

Синий показывает угол места, вращающийся вокруг оси X.

Черный показывает вращательное движение, которое должно вращаться вокруг оси Z, что невозможно с помощью axis.view_init (elevation_angle, azimuth_angle). enter image description here

Может ли кто-нибудь предложить какую-либо помощь или понять, как я могу добиться этого вращения? Спасибо

ответ

1

Вращение вокруг оси z может быть достигнуто только с помощью азимутального угла.

enter image description here

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()