【问题标题】:Spherical coordinates plot in matplotlibmatplotlib 中的球坐标图
【发布时间】:2017-11-11 04:45:40
【问题描述】:

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

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

【问题讨论】:

标签: python numpy matplotlib sympy


【解决方案1】:

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

故事的寓意是,只要XYZ可以表示为两个参数的(平滑)函数,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))是个穿裙子的小女孩? :)

【讨论】:

  • 非常优雅。如何将颜色图设置为 X 或 R?
  • @roadrunner66:您可以使用facecolors 参数为表面着色:cmap = plt.get_cmap('jet')ax.plot_surface(..., facecolors=cmap(R)).
  • Ty:) 掌心。我以前用过。
  • @unutbu 感谢您的帮助!
  • 仅作记录,“mcolors”可能应该替换为“matplotlib.colors”(或者您应该指定“import matplotlib.colors as mcolors”)
【解决方案2】:

如果您想要大量控制,您可以直接使用Poly3Dcollection 并滚动您自己的(允许您拥有不绘制的部分表面。 请注意,我将变量更改为更常见的方位角定义 phi 和 z 方向的 theta。

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

【讨论】:

  • 感谢您的帮助!
  • 这是一维数组的最佳选择。为什么任何轴都不会根据与原点的距离自动缩放?
  • 我不确定我是否理解。
猜你喜欢
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2017-05-18
  • 2015-09-12
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多