在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度的直线?
2条答案
按热度按时间1l5u6lss1#
您可以先插值数据,然后使用较大的步幅绘图。
字符串
基于这个问题here。
请注意,
scipy.ndimage.zoom
可能是矫枉过正。我不明白为什么你不能在u
和v
上使用更小的分辨率,然后相应地提高步幅。这似乎也很好:型
xoefb8l82#
这个解决方案看起来不稳定,因为你没有你期望的实际表面。所以你有点看穿它,这就是为什么线框看起来弯曲。
很难找到其他的解决方案,因为你确实需要一个好的分辨率球面(也就是说,用小的参数步长),否则你会“看穿”它。然后你需要在这个好的分辨率球面上画线。
你可以在matplotlib:http://matplotlib.org/basemap/users/examples.html中查看Basemap模块,它可能有点矫枉过正,但它可以工作。
的数据
可能有一个解决方案与Poly3DColelix和Line3D Collection:Transparency for Poly3DCollection plot in matplotlib