Python 在曲面图中剪切半个圆环

Python 在曲面图中剪切半个圆环,python,numpy,matplotlib,3d,Python,Numpy,Matplotlib,3d,我正在尝试使用matplotlib仅绘制半个圆环体 这是我目前的做法: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D n = 100 # theta: poloidal angle; phi: toroidal angle theta = np.linspace(0, 2.*np.pi, n) phi = np.linspace(0, 2.*np.pi,

我正在尝试使用
matplotlib
仅绘制半个圆环体

这是我目前的做法:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

n = 100

# theta: poloidal angle; phi: toroidal angle
theta = np.linspace(0, 2.*np.pi, n)
phi   = np.linspace(0, 2.*np.pi, n)
theta, phi = np.meshgrid(theta, phi)

# R0: major radius; a: minor radius
R0, a = 2., 1.

# torus parametrization
x = (R0 + a*np.cos(theta)) * np.cos(phi)
y = (R0 + a*np.cos(theta)) * np.sin(phi)
z = a * np.sin(theta)

# "cut-off" half of the torus
x[x>0] = np.nan

fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
ax1.set_zlim(-3,3)
ax1.plot_surface(x, y, z, rstride=5, cstride=5,)

# elev: elevation angle in z-plane
# azim: azimuth angle in x,y plane
ax1.view_init(elev=15, azim=0)

plt.show()
这样做,确实给了我半个圆环,但其中一个切割面不清晰,如图所示(这里的问题是左侧切割面)


有没有办法制作一个干净的切割表面?

nan
s切割表面通常可以做到这一点。这是因为曲面的面片是在输入数据的子集上使用线性插值绘制的,并且在边界上具有
nan
s将导致一些边面片的值的
nan
结果

在您的具体情况下,您可以将您的环面角限制为半个环面:

theta = np.linspace(0, 2*np.pi, n) 
phi   = np.linspace(0, np.pi, n) 
您还必须设置手动x/y限制,以获得相当高的纵横比:

ax1.axis([-3, 3]*2)

有一种非常通用但实用的替代方法,将
facecolors
的显式数组传递给
plot\u surface
,并操纵其中值的透明度。除非您努力工作,否则这将比默认设置更难看,因为平淡的颜色将丢失着色。这里有一个非常基本(丑陋)的例子来说明我的意思:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

n = 100 

# theta: poloidal angle; phi: toroidal angle 
theta = np.linspace(0, 2*np.pi, n) 
phi   = np.linspace(0, 2*np.pi, n) 
theta, phi = np.meshgrid(theta, phi) 

# R0: major radius; a: minor radius 
R0, a = 2., 1. 

# torus parametrization 
x = (R0 + a*np.cos(theta)) * np.cos(phi) 
y = (R0 + a*np.cos(theta)) * np.sin(phi) 
z = a * np.sin(theta) 

# "cut-off" half of the torus using transparent colors 
c = np.full(x.shape + (4,), [0, 0, 0.85, 1])  # shape (nx, ny, 4)
c[x>0, -1] = 0 # set these to transparent 

fig = plt.figure() 
ax1 = fig.add_subplot(111, projection='3d') 
ax1.set_zlim(-3,3) 
ax1.plot_surface(x, y, z, facecolors=c, rstride=5, cstride=5,)

# elev: elevation angle in z-plane 
# azim: azimuth angle in x,y plane 
ax1.view_init(elev=15, azim=0) 

plt.show() 

phi=np.linspace(0,np.pi,n)
与执行
y[y>0]=np.nan
相同,而不是
x[x>0]=np.nan
。虽然由于对称性,您的答案实际上解决了问题,但它并未对
x[x>0]=np.nan
@Bazingaa的问题进行评论是的,我想可以添加一个pi/2移位,使其完全相同。我认为很明显,截断值会干扰
plot\u surface
使用的插值。我将对此进行详细说明。好吧,这很容易(我的猜测是试图对
绘图曲面
进行“更柔和”或更平滑的插值)@Alf另一个更通用但更复杂的选择是将
面色
的显式数组传递给
绘图曲面
,但是你必须自己决定颜色,所以考虑到以上这些对你有用,我不会在我的回答中添加颜色。@AndrasDeak我明白你的意思,谢谢你的洞察力!