matplotlib 如何绘制完美光滑的球体

ftf50wuq  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(168)

我试图使用matplotlib在python中绘制一个完美光滑的球体。我一直在使用以下代码:

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

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

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))

ax.plot_surface(x, y, z, linewidth=0.0)

plt.show()

我得到的图附在下面:

生成的图形由其上的矩形曲面片组成。有没有可能使边界平滑,或者使其无法区分,并使其成为一个完美的光滑球体?

zzlelutf

zzlelutf1#

Matplotlib通过将它们分解成颜色相等的小子多边形来绘制3d表面,正如文档中所解释的那样,因此您的结果并不令人惊讶。为了获得更平滑的表面,您必须提供更多的数据点。然而,有一个小的扭曲,那就是plot_surface()可能不会使用您提供的所有数据。这是用cstriderstride关键字控制的。默认值是如何计算的,我不太清楚,但下面是一个小例子来演示效果:

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

fig,axes = plt.subplots(ncols=2,nrows=2,subplot_kw=dict(projection='3d'))

N=50
stride=2
ax = axes[0,0]
u = np.linspace(0, 2 * np.pi, N)
v = np.linspace(0, np.pi, N)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, linewidth=0.0, cstride=stride, rstride=stride)
ax.set_title('{0}x{0} data points, stride={1}'.format(N,stride))

N=50
stride=1
ax = axes[0,1]
u = np.linspace(0, 2 * np.pi, N)
v = np.linspace(0, np.pi, N)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, linewidth=0.0, cstride=stride, rstride=stride)
ax.set_title('{0}x{0} data points, stride={1}'.format(N,stride))

N=200
stride=2
ax = axes[1,0]
u = np.linspace(0, 2 * np.pi, N)
v = np.linspace(0, np.pi, N)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, linewidth=0.0, cstride=stride, rstride=stride)
ax.set_title('{0}x{0} data points, stride={1}'.format(N,stride))

N=200
stride=1
ax = axes[1,1]
u = np.linspace(0, 2 * np.pi, N)
v = np.linspace(0, np.pi, N)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, linewidth=0.0, cstride=stride, rstride=stride)
ax.set_title('{0}x{0} data points, stride={1}'.format(N,stride))

plt.show()

生成的图形如下所示:

正如您所看到的,图的结果对数据的密度和stride关键字都很敏感。不过,请注意您提供的数据量-plot_surface()可能会占用相当多的时间来提供结果。希望这能帮上忙。

相关问题