当前位置:   article > 正文

Python - Matplotlib 绘制 3D 圣诞树

Python - Matplotlib 绘制 3D 圣诞树

系列文章目录

 

前言

转自:How to draw a 3D Christmas Tree with Matplotlib | by Timur Bakibayev, Ph.D. | Analytics Vidhya | Mediumhttps://medium.com/analytics-vidhya/how-to-draw-a-3d-christmas-tree-with-matplotlib-aabb9bc27864

因为我们把圣诞树安装在暖气电池旁边,所以它很快就死了。所以我决定用 Matplotlib 绘制一棵圣诞树。你不需要为它遮阳避暑,它也不需要任何水。在阿瑞克斯星球,水的供应是有限的。地球上也是如此。 


 

一、步骤

1.1 

要在 matplotlib 中绘图,我们需要将其包含在内。

此外,我们还要为 3D 准备所有库。

  1. import math
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. fig = plt.figure()
  5. ax = fig.add_subplot(111, projection="3d")

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

  1. fig = plt.figure()
  2. ax = fig.add_subplot(111, projection="3d")
  3. k=300
  4. Z = [10 for i in range(k)]
  5. X = [math.cos(i/10) for i in range(k)]
  6. Y = [math.sin(i/10) for i in range(k)]
  7. ax.scatter(X,Y,Z, c="green", marker="^")
  8. plt.show()

abcaa172267b412eb7791c46be856193.png

不错!这是非常标准的。我们现在只修复 Z 坐标。

现在,应用 Z 坐标使其 3D 化。

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

 

02e34b2418a84beaa484923554cccfb7.png

让我们在顶部缩小圆的半径。

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

c399f425c0ec474985fc0c28bf25ba01.png

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

 

  1. plt.xlim(-500,500)
  2. plt.ylim(-500,500)

 

b742d036c61f49cb9a72bac2d709d6f4.png

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

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

60a1b24683834354b1f985354fe67598.png

 微调装饰

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

040b12e49dbd4d6abbb3354e17dc1860.png

要旋转树形图,我们需要为每一帧绘制树形图,并在 sin 和 cos 参数中添加一些常数。

我们为初始图形和每一帧复制代码。

  1. import math
  2. import matplotlib.pyplot as plt
  3. from matplotlib import animation
  4. from mpl_toolkits.mplot3d import Axes3D
  5. fig = plt.figure(figsize=(8,8))
  6. ax = fig.add_subplot(111, projection="3d")
  7. def init():
  8. k=300
  9. Z = [i for i in range(k)]
  10. X = [math.cos(i/5)*(k-i) for i in range(k)]
  11. Y = [math.sin(i/5)*(k-i) for i in range(k)]
  12. ax.scatter(X,Y,Z, c="green", marker="^")
  13. step = 3
  14. c = [(i/k,abs(0.5-i/k),i/k) for i in range(1,k,step)]
  15. Z = [i for i in range(1,k,step)]
  16. X = [math.cos(i/5+2)*(k-i+10) for i in range(1,k,step)]
  17. Y = [math.sin(i/5+2)*(k-i+10) for i in range(1,k,step)]
  18. ax.scatter(X,Y,Z, c=c, marker="o",s=40)
  19. plt.xlim(-500,500)
  20. plt.ylim(-500,500)
  21. return fig,
  22. def animate(f):
  23. fig.clear()
  24. ax = fig.add_subplot(111, projection="3d")
  25. k=300
  26. Z = [i for i in range(k)]
  27. X = [math.cos(i/5+f/10)*(k-i) for i in range(k)]
  28. Y = [math.sin(i/5+f/10)*(k-i) for i in range(k)]
  29. ax.scatter(X,Y,Z, c="green", marker="^")
  30. step = 3
  31. c = [(i/k,abs(0.5-i/k),i/k) for i in range(1,k,step)]
  32. Z = [i for i in range(1,k,step)]
  33. X = [math.cos(i/5+2+f/10)*(k-i+10) for i in range(1,k,step)]
  34. Y = [math.sin(i/5+2+f/10)*(k-i+10) for i in range(1,k,step)]
  35. ax.scatter(X,Y,Z, c=c, marker="o",s=40)
  36. plt.xlim(-500,500)
  37. plt.ylim(-500,500)
  38. return fig,
  39. ani=animation.FuncAnimation(fig, animate, init_func=init,
  40. frames=90, interval=50, blit=True)
  41. ani.save("christmas_tree.mp4")

 这就是结果:

3e144c0b569843eabbe0c90dd7035dd7.gif

 

不要忘记与您的朋友分享这棵树!

新年快乐

点击此处查看我的其他文章:timurbakibayev.medium.com

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

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/125224
推荐阅读
相关标签
  

闽ICP备14008679号