如何使用 Matplotlib 绘制 3D 圣诞树

一、步骤

1.1

``````import math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()

让我们先画一个 3D 圆，确保一切正常。

``````fig = plt.figure()
k=300
Z = [10 for i in range(k)]
X = [math.cos(i/10) for i in range(k)]
Y = [math.sin(i/10) for i in range(k)]
ax.scatter(X,Y,Z, c="green", marker="^")
plt.show()``````

``Z = [i for i in range(k)]``

``````Z = [i for i in range(k)]
X = [math.cos(i/5)*(k-i) for i in range(k)]
Y = [math.sin(i/5)*(k-i) for i in range(k)]``````

Matplotlib 总是倾向于贴合图形，只需在此处添加这些限制即可：

``````plt.xlim(-500,500)
plt.ylim(-500,500)``````

画一些红圈。它们的公式相同，但步长更大。我们还通过在 sin 和 cos 参数上加 2 来移动它，这样它们就不会与树本身相交。

``````k=300
Z = [i for i in range(k)]
X = [math.cos(i/5)*(k-i) for i in range(k)]
Y = [math.sin(i/5)*(k-i) for i in range(k)]
ax.scatter(X,Y,Z, c="green", marker="^")
k=300
step = 4
Z = [i for i in range(1,k,step)]
X = [math.cos(i/5+2)*(k-i+10) for i in range(1,k,step)]
Y = [math.sin(i/5+2)*(k-i+10) for i in range(1,k,step)]
ax.scatter(X,Y,Z, c="red", marker="o")
plt.xlim(-500,500)
plt.ylim(-500,500)
plt.show()``````

微调装饰

``````c = [(i/k,abs(0.5-i/k),i/k) for i in range(1,k,step)]
ax.scatter(X,Y,Z, c=c, marker="o",s=40)``````

``````import math
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8,8))
def init():
k=300
Z = [i for i in range(k)]
X = [math.cos(i/5)*(k-i) for i in range(k)]
Y = [math.sin(i/5)*(k-i) for i in range(k)]
ax.scatter(X,Y,Z, c="green", marker="^")
step = 3
c = [(i/k,abs(0.5-i/k),i/k) for i in range(1,k,step)]
Z = [i for i in range(1,k,step)]
X = [math.cos(i/5+2)*(k-i+10) for i in range(1,k,step)]
Y = [math.sin(i/5+2)*(k-i+10) for i in range(1,k,step)]
ax.scatter(X,Y,Z, c=c, marker="o",s=40)
plt.xlim(-500,500)
plt.ylim(-500,500)
return fig,
def animate(f):
fig.clear()
k=300
Z = [i for i in range(k)]
X = [math.cos(i/5+f/10)*(k-i) for i in range(k)]
Y = [math.sin(i/5+f/10)*(k-i) for i in range(k)]
ax.scatter(X,Y,Z, c="green", marker="^")
step = 3
c = [(i/k,abs(0.5-i/k),i/k) for i in range(1,k,step)]
Z = [i for i in range(1,k,step)]
X = [math.cos(i/5+2+f/10)*(k-i+10) for i in range(1,k,step)]
Y = [math.sin(i/5+2+f/10)*(k-i+10) for i in range(1,k,step)]
ax.scatter(X,Y,Z, c=c, marker="o",s=40)
plt.xlim(-500,500)
plt.ylim(-500,500)
return fig,
ani=animation.FuncAnimation(fig, animate, init_func=init,
frames=90, interval=50, blit=True)
ani.save("christmas_tree.mp4")``````

这就是结果：

timurbakibayev.medium.comhttp://timurbakibayev.medium.com/

THE END