Rétrogradation de Mars

Ou l’on trace le mouvement apparent de Mars dans le ciel, avec les données IMCCE et Python.

L’objectif de ce code Python est d’obtenir ce graphique :

Les positions successives de Mars y sont reportées, et affichent un mouvement apparent assez proche de ce que l’on pourrait observer au fil des mois dans le ciel lors de la prochaine rétrogradation. La taille des points représentant Mars reflète la magnitude de la planète et son évolution dans le temps.

Le portail de calculs d’éphémérides astronomiques de l’IMCCE propose notamment une partie “Éphémérides de positions”.

On peut choisir le calcul des coordonnées de Mars dans un référentiel géocentrique, pour avoir notamment les longitudes et latitudes géocentriques de Mars, ainsi que sa magnitude visuelle depuis la Terre.

La prochaine rétrogradation de Mars aura lieu au cours de l’hiver 2022-2023. J’ai donc choisi de calculer la position de Mars à compter du 1er septembre 2022, pour quelques centaines de jours.

Après calcul, on peut télécharger les données sous forme de fichier .csv que le module Pandas de Python permet de lire et gérer avec une grande efficacité.

La démarche est ici d’extraire les données utiles (dates, longitude, latitude, magnitude), puis de définir des dates servant de bornes pour sélectionner une période.

Le début du code :

import matplotlib.pyplot as plt
import pandas as pd
import datetime

plt.rcParams["font.family"] = "Ubuntu"#ou autre police installée sur l'ordinateur

#Extraction données tabulées : (données imcce)-------------------------------------------
mars=pd.read_csv("MarsGeocentre.csv", #nom du fichier
sep=';', #caractère de séparation des colonnes
usecols=[0, 1, 2, 4], #colonnes utiles
skiprows=1,#supprimer la 1e ligne d'en-têtes, qui seront renommmées ligne suivante
names=['date', 'longitude','latitude',  'magnitude'],
parse_dates=["date"],#reconnaître la colonne 'date' comme contenant des dates
)

Les valeurs lues par Pandas sont conservées dans un tableau appelé un DataFrame (vocabulaire du module Pandas), où une colonne peut servir d’index pour choisir certaines lignes.

Dans le fichier téléchargé, la colonne “date” contient les dates dans un format ISO reconnaissable par Pandas. La ligne de code suivante définit la colonne de dates comme index du DataFrame :

mars=mars.set_index("date")#Indexer les tableaux sur la date : facilite la syntaxe pour sélectionner une période

Le module datetime permet de définir des dates, ici les bornes sont du 1er septembre 2022 au 10 avril 2023 :

#Dates limitant la période souhaitée :
date_debut=datetime.date(2022, 9,1)
date_fin=datetime.date(2023, 4, 10)
pasJours=5#intervalle de jours entre deux positions

Le portail de l’IMCCE permet aussi de choisir les dates, cependant si on veut les modifier, il faut relancer les calculs et télécharger un nouveau fichier. Mieux vaut télécharger de nombreuses dates sur une période étendue, puisque le code va permettre de les sélectionner.

Sélection des dates et création de listes de coordonnées :

marsPeriode=mars.loc[date_debut:date_fin:pasJours]#filtrer entre les dates choisies
longitude=marsPeriode["longitude"]
latitude=marsPeriode["latitude"]
magnitude=-marsPeriode["magnitude"]-marsPeriode["magnitude"].min()

La dernière ligne ci-dessus affecte une valeur positive à la magnitude de Mars, pour que ces valeurs servent de paramètre (positif) de taille du point sur le graphique.

Ensuite, je définis un mode ‘clair’ et un mode ‘sombre’, au choix de l’utilisateur, pour avoir un tracé sur fond blanc ou sur fond noir. Le mode sombre donne :

#Paramètres du graphique :----------------------------------------
#Sélection du mode clair ou sombre :
mode='clair'# Choisir 'clair' ou 'sombre'
if mode=='clair':
    couleurfond='white'
    couleurtrait='k'
else:
    couleurfond='k'
    couleurtrait='white'

L’axe des abscisses a été inversé. En effet, avant la rétrogradation la longitude augmente, ce qui donnerait des positions de Mars évoluant vers la droite du graphique. Or, le mouvement de Mars est perçu dans le ciel comme un décalage vers la gauche.

Les réglages du graphique et le tracé des points :


fig=plt.figure(figsize=(15, 4), tight_layout=True, facecolor=couleurfond)
ax=plt.subplot(facecolor=couleurfond, aspect='equal')
plt.title("Mouvement rétrograde de Mars en 2022-2023", pad=20, fontsize=16, color=couleurtrait)
plt.xlabel("Longitude géocentrique de Mars", color=couleurtrait)
ax.invert_xaxis()#inversion de l'axe x
plt.ylabel("Latitude", color=couleurtrait)
plt.ylim(-1.5, 3.5)
ax.xaxis.label.set_color(couleurtrait)
ax.tick_params(colors=couleurtrait)

MagFacteur=10#facteur d'échelle pour la taille du point selon la magnitude de Mars
plt.plot(longitude, latitude, 'k', lw=0.5, zorder=1, color=couleurtrait)#ligne continue
plt.scatter(longitude, latitude, s=magnitude*MagFacteur, color='orangered', zorder=2, ec=couleurtrait)#Le tracé des points
#Annotation de la 1e date :
plt.annotate(date_debut.strftime("%d-%m-%y"), xy=(longitude[0], latitude[0]), xytext=(longitude[0]+1, latitude[0]+1),arrowprops=dict(arrowstyle="->", color=couleurtrait), color='orangered', fontsize=8)

#Affichage des dates :
texte="Période : du " + date_debut.strftime("%d %b %Y") +" au " +date_fin.strftime("%d %b %Y")+", tous les %s jours" %(pasJours)
plt.text(0, 1.0, texte, transform=ax.transAxes, c='r', va='bottom')

#référence IMCCE :
texte="Les calculs d’éphémérides de position des corps du Système solaire ont été réalisés par le service de calcul des éphémérides de l’IMCCE à travers son portail Système solaire (https://ssp.imcce.fr)"
plt.text(0, -0.3, texte, fontsize=8, transform=ax.transAxes, ha='left', va='top', color=couleurtrait)

Enfin, profitant de l’espace laissé par la trajectoire en Z inversé, j’ai inséré un second graphique pour zoomer sur la fin de la boucle de rétrogradation.

Pour cela, je recommence la procédure de sélection des dates, cette fois-ci avec un tracé tous les 2 jours.

#---------------------Second graphe (zoom)
ax2=ax.inset_axes([0, 0, 0.35, 0.55], transform=ax.transAxes)
ax2.set_facecolor(couleurfond)
ax2.set_xticks([])
ax2.invert_xaxis()
ax2.set_yticks([])
ax2.set_ylim(2.5, 2.9)

#Dates limitant la période souhaitée :
date_debut=datetime.date(2022, 12,15)
date_fin=datetime.date(2023, 2, 15)
pasJours=2#intervalle de jours entre deux positions

marsPeriode2=mars.loc[date_debut:date_fin:pasJours]#filtrer entre les dates choisies
longitude=marsPeriode2["longitude"]
latitude=marsPeriode2["latitude"]
#distance=marsPeriode2["distance"]
magnitude=-marsPeriode2["magnitude"]-marsPeriode2["magnitude"].min()
ax2.plot(longitude, latitude, 'k', lw=0.5, zorder=1, color=couleurtrait)#ligne continue
ax2.scatter(longitude, latitude, s=magnitude*MagFacteur, color='orangered', zorder=2, ec='black')#Le tracé des points
#Annotation de la 1e date :
ax2.annotate(date_debut.strftime("%d-%m-%y"), xy=(longitude[0], latitude[0]), xytext=(longitude[0], latitude[0]+0.25),arrowprops=dict(arrowstyle="->", color=couleurtrait), color='orangered', fontsize=8)
ax2.text(0.99, 0.01, "tous les %i jours"%(pasJours), transform=ax2.transAxes, c='r', va='bottom', ha='right')

Avec le module datetime, pour afficher les noms des jours et des mois en français, il faut ajouter en début de code les deux lignes suivantes :

import locale
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')#dates en français

Le fichier Python compressé :

Le fichier .csv :


Les boucles de rétrogradation de Mars présentent une grande variété de formes. Voici pour les années à venir :


Un tracé à faire pour comprendre la rétrogradation de Mars :


Voir aussi cet autre article, proposant une méthode différente pour le même résultat : au lieu d’extraire les données IMCCE d’un fichier, le code utilise le module de calculs d’éphémérides Ephem.

Soyez le premier à commenter

Laisser un commentaire