首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matplotlib中的球面坐标图

matplotlib中的球面坐标图
EN

Stack Overflow用户
提问于 2016-04-23 21:17:42
回答 2查看 37.8K关注 0票数 9

R(teta,phi) = cos(phi^2),teta0,2* pi,phi0,pi

如何借助matplotlib在球面坐标系中绘制此函数(R(teta,phi))的图?我还没有找到球面坐标的文档。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-23 21:45:42

下面的代码非常类似于Matplotlib库中的三维极坐标图。唯一的区别是使用np.meshgridPHITHETA而不是RTHETA (或3D极地图示例所称的P)制作2D数组。

故事的寓意是,只要XYZ可以用两个参数的光滑函数来表示,plot_surface就可以绘制它。

代码语言:javascript
复制
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 )应该是正的,所以您可能需要

代码语言:javascript
复制
R = np.abs(np.cos(PHI**2))

在这种情况下,

代码语言:javascript
复制
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))是个穿着连衣裙的小女孩?

票数 16
EN

Stack Overflow用户

发布于 2016-04-23 22:16:54

如果您想要大量的控制,您可以直接使用Poly3Dcollection并滚动您自己的(允许您有部分的表面,而不是你的绘图。注意,我把变量改成了方位角的phi和z方向的θ的更通用的定义。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36816537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档