使用Matplotlib绘制球体网格

r6hnlfcb  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(141)

在Matplotlib中,我想画一个球面,球面上有一个网格,在球坐标中分成30度的步长。
代码:

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

u = np.linspace(0, 2 * np.pi, 13)
v = np.linspace(0, np.pi, 7)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=1, cstride=1, color='w', shade=0)

plt.show()

字符串
生成图形:


的数据
然而,我希望球体上的轮廓是平滑的,而不是直接在绘制的点之间绘制。如果我增加采样的密度,我会得到一个更平滑的球体,但是线条绘制得太密集了:



如何在光滑的球体上画出相隔30度的直线?

1l5u6lss

1l5u6lss1#

您可以先插值数据,然后使用较大的步幅绘图。

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

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

u = np.linspace(0, 2 * np.pi, 13)
v = np.linspace(0, np.pi, 7)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

# use scipy to interpolate
xdata = scipy.ndimage.zoom(x, 3)
ydata = scipy.ndimage.zoom(y, 3)
zdata = scipy.ndimage.zoom(z, 3)

ax.plot_surface(xdata, ydata, zdata, rstride=3, cstride=3, color='w', shade=0)

plt.show()

字符串
基于这个问题here
请注意,scipy.ndimage.zoom可能是矫枉过正。我不明白为什么你不能在uv上使用更小的分辨率,然后相应地提高步幅。这似乎也很好:

...
# increased num pts by 3
u = np.linspace(0, 2 * np.pi, 39)
v = np.linspace(0, np.pi, 21)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

# Use 3x the stride, no scipy zoom
ax.plot_surface(x, y, z, rstride=3, cstride=3, color='w', shade=0)
...

xoefb8l8

xoefb8l82#

这个解决方案看起来不稳定,因为你没有你期望的实际表面。所以你有点看穿它,这就是为什么线框看起来弯曲。
很难找到其他的解决方案,因为你确实需要一个好的分辨率球面(也就是说,用小的参数步长),否则你会“看穿”它。然后你需要在这个好的分辨率球面上画线。
你可以在matplotlib:http://matplotlib.org/basemap/users/examples.html中查看Basemap模块,它可能有点矫枉过正,但它可以工作。


的数据
可能有一个解决方案与Poly3DColelix和Line3D Collection:Transparency for Poly3DCollection plot in matplotlib

相关问题