【发布时间】:2021-02-27 22:27:16
【问题描述】:
我正在尝试使用带有 Axes3D 的 matplotlib 来模拟地球绕太阳运行,我认为如果我可以将星空夜空作为背景会很棒。我在网上查了一下,发现了“imshow”,但它似乎不适用于 3D 绘图。 有谁知道如何做到这一点? 在此先感谢:)
【问题讨论】:
标签: python matplotlib background background-image mplot3d
我正在尝试使用带有 Axes3D 的 matplotlib 来模拟地球绕太阳运行,我认为如果我可以将星空夜空作为背景会很棒。我在网上查了一下,发现了“imshow”,但它似乎不适用于 3D 绘图。 有谁知道如何做到这一点? 在此先感谢:)
【问题讨论】:
标签: python matplotlib background background-image mplot3d
您可以尝试按照此处的方法 (Image overlay in 3d plot using python) 将图像放在所有 6 个方向的背景中,但另一种选择是将设置黑色背景 (Change 3D background to black in matplotlib) 与一些白点(如星星,您可以还可以随机改变大小s 和 alpha 以改善效果)。代码是,
import PIL
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
bm = PIL.Image.open('bluemarble.jpg')
bm = np.array(bm.resize([int(d/5) for d in bm.size]))/256.
lons = np.linspace(-180, 180, bm.shape[1]) * np.pi/180
lats = np.linspace(-90, 90, bm.shape[0])[::-1] * np.pi/180
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.outer(np.cos(lons), np.cos(lats)).T
y = np.outer(np.sin(lons), np.cos(lats)).T
z = np.outer(np.ones(np.size(lons)), np.sin(lats)).T
ax.plot_surface(x, y, z, rstride=4, cstride=4, facecolors = bm)
#Add some stars
x, y, z = 10*(np.random.rand(3,100)-0.5)
ax.scatter(x, y, z, s=0.1, c='w')
#Set backgroudn to black
fig.set_facecolor('black')
ax.set_facecolor('black')
ax.grid(False)
ax.w_xaxis.pane.fill = False
ax.w_yaxis.pane.fill = False
ax.w_zaxis.pane.fill = False
plt.show()
如下所示,
我用这张图片复制了以下示例 (Creating a rotatable 3D earth),
得到地球。
【讨论】: