3d绘图:圆柱坐标函数

时间:2016-01-18 18:05:30

标签: python python-2.7 math matplotlib plot

我有一个绘制极坐标函数。

首先我设置径向(r)和极性(phi)变量的值。

pi=np.pi
r=np.linspace(0,4,30)
phi=np.linspace(0,2*pi,10)

然后我做A0(r,phi),其中A0是我写的函数,它对r和phi的每个值都有一个实数值。

我存储它的方式是A0 [r,phi]。巫婆意味着'row'表示径向坐标,'column'表示极坐标。

Ao,如果我在r中使用n个值,并且在phi中使用m个值,则A0是(n,m)矩阵或(n,m)形状的numpy数组。 (在我的例子中,它是一个(30,10)numpy数组)

'A0'似乎应该工作,但问题是我不知道如何绘制它。

我正在尝试这样的事情:

fig=pyplot.figure()
ax = pyplot.subplot(111, projection='3d')

R, P = np.meshgrid(r, phi)
X, Y = R*np.cos(P), R*np.sin(P)

ax.plot_wireframe(X,Y, A0, rstride=10, cstride=10)

尝试遵循matplotlib示例,但它说形状不一致,因为它有尺寸问题(在X,Y和A0之间)。

任何想法??

如果我这样做,它可以正常工作:

fig = pyplot.figure(figsize=(11,7), dpi=100)
ax = pyplot.subplot(111, projection='3d')

for j, rn in enumerate(r):
    for k, phin in enumerate(phi):
        ax.scatter(rn*np.cos(phin), rn*np.sin(phin), A0[j,k],',b')

但我想要一个表面或线材图,而不是分散。

以下是完整代码:

import numpy as np
from scipy.special import binom as binom 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import pyplot
from matplotlib import cm
import matplotlib
%matplotlib inline

'''Define A_(pm)  (Gauss-laguerre polinomials) '''

def Ln(p,m,xj):
    Ln=0.
    for i in range(p+1):#el p+1 es por la indexacion
        Ln=Ln+((-1)**i)*binom(p+m,p-i)*(xj**i)/np.math.factorial(i)
    return Ln

def A(p, m, r, phi):#defino G-L

    A0=np.zeros((len(r),len(phi)))
    for j, rn in enumerate(r):
        A0[j]=np.exp(-rn**2)*Ln(p,0,2*rn**2)

    A1=np.zeros((len(r),len(phi)))
    for j, rn in enumerate(r):
         for k, phin in enumerate(phi):
            A1[k,j]=2*((2*rn**2)**(m/2))*np.sqrt(np.math.factorial(p)/np.math.factorial(p+m))*np.exp(-rn**2)*Ln(p,m,2*(rn**2))*np.sin(m*phin)

    A2=np.zeros((len(r),len(phi)))

    for j, rn in enumerate(r):
        for k, phin in enumerate(phi):
            A2[k,j]=2*(2*rn**2)**(m/2)*np.sqrt(np.math.factorial(p)/np.math.factorial(p+m))*np.exp(-rn**2)*Ln(p,m,2*rn**2)*np.cos(m*phin)


    return A0, A1, A2

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

   A0, A1, A2=A(5,1,r,phi)#i think a have a bugs with the values of m .

   fig = pyplot.figure(figsize=(11,7), dpi=100)
   ax = pyplot.subplot(111, projection='3d')

for j, rn in enumerate(r):
    for k, phin in enumerate(phi):
        #ax.scatter(rn*np.cos(phin), rn*np.sin(phin), A0[j,k],'.b')
        ax.scatter(rn*np.cos(phin), rn*np.sin(phin), A1[j,k],'.r')
        #ax.scatter(rn*np.cos(phin), rn*np.sin(phin), A2[j,k],'.r')

这样可行,但分散不是我想要的。 这是我试图做的,但是如果r和phi具有不同的尺寸,它就不起作用。

fig = pyplot.figure(figsize=(11,9), dpi=100)
ax = pyplot.subplot(111, projection='3d')
R, P = np.meshgrid(r, phi)
X, Y = R*np.cos(P), R*np.sin(P)
print 'shape r=', np.shape(r)
print 'shape R=', np.shape(R)
print 'shape P=', np.shape(P)
A0, A1, A2=A(5,0,R[1],R[0])
ax.plot_surface(X, Y, np.transpose(A0), rstride=3, cstride=3,   cmap=pyplot.get_cmap('viridis'))

1 个答案:

答案 0 :(得分:1)

在你的代码中看起来有些混乱,但是解开了一些东西,下面的代码为我制作了一个情节。 您的A0函数在phi中保持不变,因此您可以使用r为给定的A0[:,j]分配所有值。我认为您的phir索引的轮次错误,这可能导致您的NumPy广播错误。

import numpy as np
from scipy.special import binom as binom 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import pyplot
plt = pyplot
from matplotlib import cm
import matplotlib

'''Define A_(pm)  (Gauss-laguerre polinomials) '''

def Ln(p,m,xj):
    Ln=0.
    for i in range(p+1):#el p+1 es por la indexacion
        Ln=Ln+((-1)**i)*binom(p+m,p-i)*(xj**i)/np.math.factorial(i)
    return Ln

def A(p, m, r, phi):#defino G-L

    A0=np.zeros((len(phi),len(r)))
    for j, rn in enumerate(r):
            A0[:,j]=np.exp(-rn**2)*Ln(p,0,2*rn**2)

    A1=np.zeros_like(A0)
    for j, rn in enumerate(r):
         for k, phin in enumerate(phi):
            A1[k,j]=2*((2*rn**2)**(m/2))*np.sqrt(np.math.factorial(p)/np.math.factorial(p+m))*np.exp(-rn**2)*Ln(p,m,2*(rn**2))*np.sin(m*phin)

    A2=np.zeros_like(A0)

    for j, rn in enumerate(r):
        for k, phin in enumerate(phi):
            A2[k,j]=2*(2*rn**2)**(m/2)*np.sqrt(np.math.factorial(p)/np.math.factorial(p+m))*np.exp(-rn**2)*Ln(p,m,2*rn**2)*np.cos(m*phin)


    return A0, A1, A2

pi=np.pi
r=np.linspace(0,6,50)
phi=np.linspace(0,2*pi,40)

A0, A1, A2=A(5,1,r,phi)#

fig = pyplot.figure(figsize=(11,9), dpi=100)
ax = pyplot.subplot(111, projection='3d')
R, P = np.meshgrid(r, phi)
X, Y = R*np.cos(P), R*np.sin(P)
ax.plot_surface(X, Y, A0)

plt.show()

enter image description here