百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

模拟太阳系8大行星运行图:matplotlib实现

toyiye 2024-07-05 01:32 29 浏览 0 评论

1 效果图

2 说明

=====

2.1 我曾用matplotlib实现模拟太阳-地球-月亮的运行轨迹图,很受欢迎。

《python3的matplotlib的模拟太阳-地球-月亮运动示意图代码分析》

2.2 这次再使用python3的语言,用matplotlib来实现太阳系的八大行星模拟示意图。

2.3 熟悉python编程语言和思维,熟悉matplotlib作图。

3 代码讲解:

=========

3.1 第1步:导入模块

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animmation

3.2 第2步:画布的相关设置

f = plt.figure(figsize=(15,15))   #绘图的画布大小和定义初始化
f.patch.set_facecolor('black')   #画布背景颜色设置
ax = f.add_subplot(111,projection='3d')   #设置3d坐标系
#这个只是图表中的背景颜色设置
ax.set_facecolor("black")
# OR
#ax.set(facecolor = "black")
#三维坐标刻度设置
ax.set_xlim([-65, 65])
ax.set_ylim([-65, 65])
#模型在坐标系中的范围
ax.set_zlim([-3, 3])

3.3 第3步:太阳设置:形状,颜色和大小,位置固定

ax.plot([0], [0], [0], marker='o', color= 'red', markersize=70)

3.4 第4步:8大行星的半径、轨道和角度设置

#常量的设置
#设置轨道半径
r_list=[40,43,46,51,55,62,71,85]
#设置行星角速度
o_list=[13,9,7,6,5,4,3,2]
#设置环绕一周时间的范围以及运动间隔时间
t_range = np.arange(0, 1 + 0.005, 0.005)
t_len = len(t_range)

#行星坐标随时间变化方程
#z坐标
zz=np.zeros(t_len)
#x和y坐标
x_l_list=[]
y_l_list=[]

for i in range(len(r_list)):
    x_l_list.append(r_list[i] * np.cos(o_list[i]* np.pi* t_range))
    y_l_list.append(r_list[i] * np.sin(o_list[i]* np.pi* t_range))

#绘制行星的圆形轨迹
for i in range(len(r_list)):
    #轨道线颜色和宽度设置
    ax.plot(x_l_list[i], y_l_list[i], zz, 'gray',linewidth=0.2)

3.5 第5步:8大行星颜色和大小设置

ball1, = ax.plot([], [], [], marker='o', color='yellow',markersize=10)  
ball2, = ax.plot([], [], [], marker='o', color='pink',markersize=10)  
ball3, = ax.plot([], [], [], marker='o', color='blue',markersize=10)
ball4, = ax.plot([], [], [], marker='o', color='orange',markersize=10)
ball5, = ax.plot([], [], [], marker='o', color='brown',markersize=16)  
ball6, = ax.plot([], [], [], marker='o', color='red',markersize=16)
ball7, = ax.plot([], [], [], marker='o', color='gray',markersize=14)
ball8, = ax.plot([], [], [], marker='o', color='green',markersize=14)

3.6 第6步:初始化行星的起始位置

def init():

    return ball1,ball2, ball3,ball4,ball5,ball6,ball7,ball8  

3.7 第7步:数据更新,随时间t的变换设置新的行星位置坐标

def update(data):

    ball1.set_data([data[0], data[1]])  
    ball1.set_3d_properties(data[2])

    ball2.set_data([data[3],data[4]])  
    ball2.set_3d_properties(data[5])  

    ball3.set_data([data[6], data[7]])  
    ball3.set_3d_properties(data[8])  

    ball4.set_data([data[9], data[10]])  
    ball4.set_3d_properties(data[11])  

    ball5.set_data([data[12], data[13]]) 
    ball5.set_3d_properties(data[14]) 

    ball6.set_data([data[15], data[16]])  
    ball6.set_3d_properties(data[17])  

    ball7.set_data([data[18], data[19]])  
    ball7.set_3d_properties(data[20])  

    ball8.set_data([data[21], data[22]])  
    ball8.set_3d_properties(data[23])  

    return ball1,ball2,ball3,ball4,ball5,ball6,ball7,ball8  

3.8 第8步:8大行星的数据更新,随时间t变换的行星坐标

def data_gen():
    data = [] 
    for ti in range(1,t_len):
        t = t_range[ti]
        #行星与太阳坐标的关系方程
        xt1 = r_list[0] * np.cos(o_list[0] * np.pi* t)  
        yt1 = r_list[0] * np.sin(o_list[0] * np.pi* t) 

        xt2 = r_list[1] * np.cos(o_list[1] * np.pi* t)  
        yt2 = r_list[1] * np.sin(o_list[1] * np.pi* t) 

        xt3 = r_list[2] * np.cos(o_list[2]* np.pi * t)  
        yt3 = r_list[2] * np.sin(o_list[2] * np.pi* t) 

        xt4 = r_list[3] * np.cos(o_list[3]* np.pi * t)
        yt4 = r_list[3] * np.sin(o_list[3] * np.pi* t)

        xt5 = r_list[4] * np.cos(o_list[4]* np.pi * t) 
        yt5 = r_list[4] * np.sin(o_list[4] * np.pi* t) 

        xt6 = r_list[5] * np.cos(o_list[5] * np.pi* t)  
        yt6 = r_list[5] * np.sin(o_list[5]* np.pi * t)

        xt7 = r_list[6] * np.cos(o_list[6] * np.pi* t)  
        yt7 = r_list[6] * np.sin(o_list[6]* np.pi * t) 

        xt8 = r_list[7] * np.cos(o_list[7] * np.pi* t)  
        yt8 = r_list[7] * np.sin(o_list[7] * np.pi* t) 

        zt=0

        data.append([xt1,yt1,zt,xt2,yt2,zt,xt3,yt3,zt,xt4,yt4,zt,xt5,yt5,zt,xt6,yt6,zt,xt7,yt7,zt,xt8,yt8,zt])  

    return data

3.9 第9步:动画挂起和展示

ani = animmation.FuncAnimation(f, update, frames = data_gen(), init_func = init,interval = 200)
#隐藏画轴
plt.axis('off')
plt.show()

分享出来,在动画中学习计算机编程,学习python思维。

相关推荐

如何用 coco 数据集训练 Detectron2 模型?

随着最新的Pythorc1.3版本的发布,下一代完全重写了它以前的目标检测框架,新的目标检测框架被称为Detectron2。本教程将通过使用自定义coco数据集训练实例分割模型,帮助你开始使...

CICD联动阿里云容器服务Kubernetes实践之Bamboo篇

本文档以构建一个Java软件项目并部署到阿里云容器服务的Kubernetes集群为例说明如何使用Bamboo在阿里云Kubernetes服务上运行RemoteAgents并在agents上...

Open3D-ML点云语义分割实验【RandLA-Net】

作为点云Open3D-ML实验的一部分,我撰写了文章解释如何使用Tensorflow和PyTorch支持安装此库。为了测试安装,我解释了如何运行一个简单的Python脚本来可视化名为...

清理系统不用第三方工具(系统自带清理软件效果好不?)

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

【信创】联想开先终端开机不显示grub界面的修改方法

原文链接:【信创】联想开先终端开机不显示grub界面的修改方法...

如意玲珑成熟度再提升,三大发行版支持教程来啦!

前期,我们已分别发布如意玲珑在deepinV23与UOSV20、openEuler24.03发行版的操作指南,本文,我们将为大家详细介绍Ubuntu24.04、Debian12、op...

118种常见的多媒体文件格式(英文简写)

MP4[?mpi?f??]-MPEG-4Part14(MPEG-4第14部分)AVI[e?vi??a?]-AudioVideoInterleave(音视频交错)MOV[m...

密码丢了急上火?码住7种console密码紧急恢复方式!

身为攻城狮的你,...

CSGO丨CS2的cfg指令代码分享(csgo自己的cfg在哪里?config文件位置在哪?)

?...

使用open SSL生成局域网IP地址证书

某些特殊情况下,用户内网访问多可文档管理系统时需要启用SSL传输加密功能,但只有IP,没有域名和证书。这种情况下多可提供了一种免费可行的方式,通过openSSL生成免费证书。此方法生成证书浏览器会提示...

Python中加载配置文件(python怎么加载程序包)

我们在做开发的时候经常要使用配置文件,那么配置文件的加载就需要我们提前考虑,再不使用任何框架的情况下,我们通常会有两种解决办法:完整加载将所有配置信息一次性写入单一配置文件.部分加载将常用配置信息写...

python开发项目,不得不了解的.cfg配置文件

安装软件时,经常会见到后缀为.cfg、.ini的文件,一般我们不用管,只要不删就行。因为这些是程序安装、运行时需要用到的配置文件。但对开发者来说,这种文件是怎么回事就必须搞清了。本文从.cfg文件的创...

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统,本次使用的是开源鸿蒙主板,搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件,包括核心板、开发板、嵌入式主板,工控整机等...

Python9:图像风格迁移-使用阿里的接口

先不多说,直接上结果图。#!/usr/bin/envpython#coding=utf-8importosfromaliyunsdkcore.clientimportAcsClient...

Python带你打造个性化的图片文字识别

我们的目标:从CSV文件读取用户的文件信息,并将文件名称修改为姓名格式的中文名称,进行规范资料整理,从而实现快速对多个文件进行重命名。最终效果:将原来无规律的文件名重命名为以姓名为名称的文件。技术点:...

取消回复欢迎 发表评论:

请填写验证码