matplotlib中的球面坐标图

Rom*_*man 4 python numpy matplotlib sympy

R(teta,phi)= cos(phi ^ 2),teta [0,2*pi],phi [0,pi]

如何在matplotlib的帮助下绘制这个函数(R(teta,phi))在球坐标系中的图形?文档我还没有找到球面坐标.

unu*_*tbu 8

下面的代码非常类似于Matplotlib画廊的3D极坐标图.唯一的区别是你np.meshgrid用来制作2D数组PHITHETA 不是RTHETA(或者3D极图的示例调用P).

这个故事的寓意是,只要X,YZ可以表示为两个参数(平滑)功能,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()
Run Code Online (Sandbox Code Playgroud)

产量

在此输入图像描述


通常R,半径应为正,因此您可能需要

R = np.abs(np.cos(PHI**2))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,

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)
Run Code Online (Sandbox Code Playgroud)

产量

在此输入图像描述

谁知道R = np.abs(np.cos(PHI**2))穿裙子的小女孩?:)