python - 绘制圆锥体时断开的表面

标签 python matplotlib

我想用 python 绘制曲面 (z+1)²=x²+y² 和 4z=x²+y²。

我写了这段代码:

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

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
X= np.arange(-2,3,.1)
Z=np.arange(0,2,.1)
X,Z = np.meshgrid(X,Z)
Y=np.sqrt((Z+1)**2-X**2)
Y2=np.sqrt(4*Z-X**2)
ax.plot_wireframe(X, Y, Z, rstride = 1, cstride =1)
ax.plot_wireframe(X, -Y, Z, rstride = 1, cstride =1)
ax.plot_surface(X,Y2,Z,rstride=1,cstride=1,color='red')
ax.plot_surface(X,-Y2,Z,rstride=1,cstride=1,color='red')
ax.set_zlim(0,2)

plt.show()

这必须显示两个锥体。但是,每个圆锥体不是连续的,即缺少一些面孔,我不知道为什么。非常感谢任何帮助。

最佳答案

您定义 X 和 Y 的方式在这些连接处引起了一些 panic 。在将圆锥体转换为 X 和 Y 之前,您可以通过根据半径和角度定义圆锥体来获得更平滑的连接,这样您就可以保持以旧方式生成的漂亮 Z 轮廓。

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

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')

# Set up the grid in polar
theta = np.linspace(0,2*np.pi,90)
r = np.linspace(0,3,50)
T, R = np.meshgrid(theta, r)

# Then calculate X, Y, and Z
X = R * np.cos(T)
Y = R * np.sin(T)
Z = np.sqrt(X**2 + Y**2) - 1

# Set the Z values outside your range to NaNs so they aren't plotted
Z[Z < 0] = np.nan
Z[Z > 2.1] = np.nan
ax.plot_wireframe(X, Y, Z)

ax.set_zlim(0,2)

plt.show()

这会给你一个非常好的圆锥体: wireframe plot of a cone

关于python - 绘制圆锥体时断开的表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874791/

相关文章:

python - 检查 pandas DataFrame 系列中的值是否存在于 Excel 工作表中

pandas - 在 Pandas 直方图中设置 y 轴限制

python - 关于 matplotlib 的 .show()

python - 从django直接上传到S3

python - 如何使用 Content-MD5 将对象放入 s3

python - 如何使用 python 消除 json 文件中的冗余

python - 如何使用 matplotlib 0.99 在两侧显示 yaxis?

python - 如何创建 MultiIndex 的笛卡尔积,包括范围内但不在索引中的日期

python - 我如何在 matplotlib 中获得笛卡尔坐标系?

python-3.x - Matplotlib 在 semilogx 图上分布标记