Positions des planètes

Où l’on trace un diagramme pour prévoir la visibilité des planètes, en atelier astronomie.

En atelier astronomie au lycée, j’ai récemment utilisé un document issu des éphémérides du magazine l’Astronomie.

En guise d’introduction au thème des planètes, ce document est propice à de nombreux commentaires :

  • forme des trajectoires
  • arcs parcourus par différentes planètes durant un temps donné
  • vocabulaire spécifique : élongation, conjonctions supérieure et inférieure
  • etc.

J’ai utilisé ce document pour faire chercher quelles planètes sont visibles et à quel moment (début et/ou fin de nuit).


Puis, il m’est venu l’idée de produire moi-même un tel document, en rédigeant un script Python.

La méthode consiste à obtenir les éphémérides de position des planètes fournies par l’IMCCE, les télécharger dans des fichiers csv, puis à rédiger un script lisant les données utiles dans ces fichiers.

Le portail des éphémérides de l’ l’IMCCE

Les données recherchées ici sont accessibles avec “Éphémérides de position“.

Pour le repère héliocentrique, je choisis “héliocentre” pour le centre du repère, le plan de l’écliptique comme plan de référence, une planète, et une période de mon choix.

Pour le choix des dates, le formulaire permet de sélectionner la date de début ainsi que le pas de calculs. Cependant, puisque le script que je propose ici permet facilement de sélectionner des dates et un intervalle de temps, on peut sélectionner une année entière, avec 365 dates calculées.

Au moment de télécharger le fichier csv, j’ai pris garde de choisir le format décimal pour les angles.

L’opération est à répéter pour chaque planète (dont la Terre). Ce n’est pas si long, car en cliquant sur “nouveau calcul”, les paramètres choisis précédemment sont mémorisés.

Dans les fichiers .csv, la longitude écliptique de la planète se trouve dans la colonne “Longitude (deg)” et la distance au Soleil dans la colonne “Dobs (au)” en Unité Astronomique (voir la documentation sur la page de l’IMCCE).

#Éphémérides pour la planète Mars :
Date (undefined);Longitude (deg);Latitude (deg);Dobs (au);VMag (mag);Phase (deg);muLoncosLat (arcsec/min);muLat (arcsec/min);RV (km/s)
2021-12-01T12:00:00.000;220.4003841;0.2920341;1.574392616879;0.45;0;1.1850967;-0.0519656;-2.0371353
2021-12-06T12:00:00.000;222.851732;0.2136956;1.568450790004;0.43;0;1.1896301;-0.0536337;-2.0774666
2021-12-11T12:00:00.000;225.3218744;0.1343605;1.562397563948;0.42;0;1.1941816;-0.0551787;-2.1142623
2021-12-16T12:00:00.000;227.811377;0.0541509;1.556243366201;0.4;0;1.1987611;-0.056571;-2.1473717
2021-12-21T12:00:00.000;230.3207872;-0.0268035;1.549999059825;0.38;0;1.2033825;-0.0577796;-2.176644

Le script Python commence ainsi :

import numpy as np
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)-------------------------------------------
mercure=pd.read_csv("mercureEphemeride2022.csv", #nom du fichier
sep=';', #caractère de séparation des colonnes
usecols=[0, 1, 3], #colonnes utiles
skiprows=1,#supprimer la 1e ligne d'en-têtes des colonnes, qui seront renommmées ligne suivante
names=['date', 'longitude', 'distance'],
parse_dates=["date"],#reconnaître la colonne 'date' comme contenant des dates
)
venus=pd.read_csv("venusEphemeride2022.csv", sep=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'] , 
parse_dates=["date"])
terre=pd.read_csv("terreEphemeride2022.csv", sep=';',  usecols=[0,1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])
mars=pd.read_csv("marsEphemeride2022.csv", sep=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])
jupiter=pd.read_csv("jupiterEphemeride2022.csv", sep=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])
saturne=pd.read_csv("saturneEphemeride2022.csv", sep=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])

Pour chaque planète, j’extrais les données sous forme de deux listes (en réalité des “Series”, selon la bibliothèque Pandas) : une liste pour la longitude, une liste pour la distance.

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

Ensuite, je définis une période en définissant les dates limites :

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

Je crée une fonction qui va réaliser 3 tâches sur le tableau de chaque planète :

  • indexer le tableau sur la date, pour faciliter la syntaxe de filtrage selon la période voulue
  • filtrer les lignes de la période voulue
  • renvoyer la liste des longitudes écliptiques et des distances au Soleil
def coordonnees(planete, nom):
    planete=planete.set_index("date")#Indexer les tableaux sur la date : facilite la syntaxe pour sélectionner une période
    planete=planete.loc[date_debut:date_fin:pasJours]#filtrer entre les dates choisies
    longitude=np.radians(planete["longitude"])
    distance=planete["distance"]
    derniereDate=planete.index[-1]
    return longitude, distance, derniereDate

Je crée un dict attribuant une couleur à chaque planète :

#Liste des couleurs par planète :
couleurs={
'Mercure':'gray',
'Vénus':'tan',
'Terre':'royalblue', 
'Mars':'orangered',
'Jupiter':'orange',
'Saturne':'goldenrod' }

Le choix d’un diagramme polaire s’impose, dans le document souhaité. Voici les paramètres graphiques :

#Paramètres du graphique :
fig=plt.figure(figsize=(21/2.54, 29.7/2.54 ), tight_layout=True)#dimensions A4
ax=plt.subplot(projection='polar')
plt.title("Position héliocentrique des planètes en 2022", pad=20, fontsize=16)
plt.scatter(0, 0, s=200, c='orange', zorder=2)    #Soleil
taillePoint=20#taille du point sur le tracé

#Tracé des positions des planètes : (ajouter ou supprimer des planètes, en conservant la structure de la liste)
for (planete, nom) in [
(mercure, 'Mercure'), 
(venus, 'Vénus'),
(terre, 'Terre'), 
(mars, 'Mars'),
#(jupiter, 'Jupiter'), 
#(saturne, 'Saturne'), 
]:
    longitude, distance, derniereDate=coordonnees(planete, nom)
    plt.scatter(longitude, distance, s=taillePoint, label=nom, color=couleurs[nom], zorder=2)
    plt.scatter(longitude[0], distance[0], s=taillePoint, color='k', zorder=2)#1ere position 
    
#Affichage des dates :
texte="Période : \n du " + date_debut.strftime("%d %b %Y") +"\n au " +derniereDate.strftime("%d %b %Y")+" \n tous les %s jours" %(pasJours)
plt.text(0.05, 0.85, texte, transform=fig.transFigure, c='r', va='top')

plt.yticks([1], [])#suppression des cercles et graduations en rayon.
plt.xticks(np.radians(np.arange(0, 360, 15)))#sélection des lignes d'angles

Il y a une différence entre la dernière date de la période demandée (appelée date_debut) et la date du dernier point affiché (si la durée de la période n’est pas un multiple du pas de temps). C’est pourquoi la fonction coordonnees renvoie également la dernière date du tracé.

Le tracé pour les planètes extérieures a tendance à trop compresser l’échelle des distances. Si la période choisie n’est pas trop longue (quelques semaines), j’ai trouvé préférable de tracer une flèche indiquant la position moyenne de la planète sur la période. C’est suffisant pour estimer la période de visibilité et les dates de conjonctions.

Attention, cependant : si durant la période choisie, la longitude de la planète passe d’un angle légèrement inférieur à 360° à un angle de quelques degrés, l’orientation de la flèche est faussée, car la moyenne est calculée sur une gamme de valeurs discontinues.

#Affichage de flèches pour les planètes extérieures (si non tracées auparavant).
#La flèche pointe vers la longitude moyenne de la planete sur la période choisie.
#Sa direction n'a de sens que pour une période assez courte (1 mois, environ)
#Attention : direction erronée si la longitude passe de 360 à 0 durant la période !
for (planete, nom) in [
(jupiter, 'Jupiter'), 
(saturne, 'Saturne'), 
]:
    longitude, distance, _ =coordonnees(planete, nom)
    ax.annotate("", xy=(longitude.mean(), 0.1*distance.mean()), xytext=(0, 0),arrowprops=dict(arrowstyle="->", color=couleurs['Jupiter']), color=couleurs[nom])
    plt.text(longitude.mean(), 0.1*distance.mean(), nom, ha='right',va='center', rotation=np.degrees(longitude.mean()))

Le code complet (compressé), ainsi que les fichiers .csv :

Voir aussi cet autre article, avec une version s’appuyant sur le module PyEphem. L’avantage est de s’affranchir de données stockées dans un fichier annexe, ce qui laisse plus de liberté sur les dates choisies.

Un commentaire

  1. Anonyme said:

    Article très interessant. J’ai essayé de l’exécuter avec Thonny et cela plante. Bizarre.

    5 janvier 2024

Laisser un commentaire