作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用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
切割曲面通常可以做到这一点。这是因为表面的补丁是在输入数据的子集上使用线性插值绘制的,并且边界上有 nan
将导致 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_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()
关于python - 在曲面图中截掉半个圆环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169217/
我是一名优秀的程序员,十分优秀!