R(teta,phi)= cos(phi^2),teta[0,2*pi],phi[0,pi]如何在matplotlib的帮助下在球坐标系中绘制这个函数(R(teta,phi))的图形?我没有找到球坐标的文档。
9wbgstp71#
下面的代码非常像Matplotlib库中的3D polar plot。唯一的区别是使用np.meshgrid为PHI和THETA生成2D数组,而不是R和THETA(或者3D极坐标图示例中所称的P)。这个故事的寓意是,只要X、Y和Z可以表示为两个参数的(平滑)函数,plot_surface就可以绘制它。
np.meshgrid
PHI
THETA
R
P
X
Y
Z
plot_surface
import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.mplot3d.axes3d as axes3d theta, phi = np.linspace(0, 2 * np.pi, 40), np.linspace(0, np.pi, 40) THETA, PHI = np.meshgrid(theta, phi) R = np.cos(PHI**2) X = R * np.sin(PHI) * np.cos(THETA) Y = R * np.sin(PHI) * np.sin(THETA) Z = R * np.cos(PHI) fig = plt.figure() ax = fig.add_subplot(1,1,1, projection='3d') plot = ax.plot_surface( X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('jet'), linewidth=0, antialiased=False, alpha=0.5) plt.show()
产量
通常,半径R应为正数,因此您可能需要
R = np.abs(np.cos(PHI**2))
这样的话
import matplotlib.colors as mcolors cmap = plt.get_cmap('jet') norm = mcolors.Normalize(vmin=Z.min(), vmax=Z.max()) plot = ax.plot_surface( X, Y, Z, rstride=1, cstride=1, facecolors=cmap(norm(Z)), linewidth=0, antialiased=False, alpha=0.5)
谁知道R = np.abs(np.cos(PHI**2))是一个穿裙子的小女孩?:)
wn9m85ua2#
如果你想要更多的控制,你可以直接使用Poly3Dcollection,并滚动你自己的(允许你有部分的表面,你不打印。请注意,我将变量更改为更常见的定义,即方位角为phi,z方向为theta。
Poly3Dcollection
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection import numpy as np from __future__ import division fig = plt.figure() ax = fig.gca(projection='3d') nphi,nth=48,12 phi = np.linspace(0,360, nphi)/180.0*np.pi th = np.linspace(-90,90, nth)/180.0*np.pi verts2 = [] for i in range(len(phi)-1): for j in range(len(th)-1): r= np.cos(phi[i])**2 # <----- your function is here r1= np.cos(phi[i+1])**2 cp0= r*np.cos(phi[i]) cp1= r1*np.cos(phi[i+1]) sp0= r*np.sin(phi[i]) sp1= r1*np.sin(phi[i+1]) ct0= np.cos(th[j]) ct1= np.cos(th[j+1]) st0= np.sin(th[j]) st1= np.sin(th[j+1]) verts=[] verts.append((cp0*ct0, sp0*ct0, st0)) verts.append((cp1*ct0, sp1*ct0, st0)) verts.append((cp1*ct1, sp1*ct1, st1)) verts.append((cp0*ct1, sp0*ct1, st1)) verts2.append(verts ) poly3= Poly3DCollection(verts2, facecolor='g') poly3.set_alpha(0.2) ax.add_collection3d(poly3) ax.set_xlabel('X') ax.set_xlim3d(-1, 1) ax.set_ylabel('Y') ax.set_ylim3d(-1, 1) ax.set_zlabel('Z') ax.set_zlim3d(-1, 1) plt.show()
2条答案
按热度按时间9wbgstp71#
下面的代码非常像Matplotlib库中的3D polar plot。唯一的区别是使用
np.meshgrid
为PHI
和THETA
生成2D数组,而不是R
和THETA
(或者3D极坐标图示例中所称的P
)。这个故事的寓意是,只要
X
、Y
和Z
可以表示为两个参数的(平滑)函数,plot_surface
就可以绘制它。产量
通常,半径
R
应为正数,因此您可能需要这样的话
产量
谁知道
R = np.abs(np.cos(PHI**2))
是一个穿裙子的小女孩?:)wn9m85ua2#
如果你想要更多的控制,你可以直接使用
Poly3Dcollection
,并滚动你自己的(允许你有部分的表面,你不打印。请注意,我将变量更改为更常见的定义,即方位角为phi,z方向为theta。