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
delimiter=';', #caractère de séparation des colonnes
usecols=[0, 1, 3], #colonnes utiles
skiprows=1,#supprimer la 1e ligne d'en-têtes, 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", delimiter=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'] , 
parse_dates=["date"])
terre=pd.read_csv("terreEphemeride2022.csv", delimiter=';',  usecols=[0,1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])
mars=pd.read_csv("marsEphemeride2022.csv", delimiter=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])
jupiter=pd.read_csv("jupiterEphemeride2022.csv", delimiter=';',  usecols=[0, 1, 3], skiprows=1,
names=['date', 'longitude', 'distance'], 
parse_dates=["date"])
saturne=pd.read_csv("saturneEphemeride2022.csv", delimiter=';',  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.

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, debut, fin, 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"]
    return longitude, distance

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=(8, 8), tight_layout=True)
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')    #Soleil
taillePoint=20#taille du point sur le tracé

#Récupération des coordonnées (longitude, distance) par planète :
Lmercure, Dmercure=coordonnees(mercure, date_debut, date_fin, 'Mercure')
Lvenus, Dvenus=coordonnees(venus, date_debut, date_fin, 'Vénus')
Lterre, Dterre=coordonnees(terre, date_debut, date_fin, "Terre")
Lmars, Dmars=coordonnees(mars, date_debut, date_fin, "Mars")
Ljupiter,Djupiter=coordonnees(jupiter, date_debut, date_fin, "Jupiter")
Lsaturne,Dsaturne=coordonnees(saturne, date_debut, date_fin, "Saturne")

#Tracé des positions :
plt.scatter(Lmercure, Dmercure, s=taillePoint, label='Mercure', color=couleurs['Mercure'])
plt.scatter(Lvenus, Dvenus, s=taillePoint,label='Vénus', color=couleurs['Vénus'])
plt.scatter(Lterre, Dterre, s=taillePoint,label='Terre', color=couleurs['Terre'])
plt.scatter(Lmars, Dmars, s=taillePoint, label='Mars', color=couleurs['Mars'])
#plt.scatter(Ljupiter, Djupiter, s=taillePoint, label='Jupiter', color=couleurs['Jupiter'])
#plt.scatter(Lsaturne, Dsaturne, s=taillePoint, label='Saturne', color=couleurs['Saturne'])

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) :
"""
Direction de Jupiter déterminée avec Ljupiter.mean(), pour tracer la flèche.
"""
ax.annotate("", xy=(Ljupiter.mean(), 1.2), xytext=(0, 0),arrowprops=dict(arrowstyle="->", color=couleurs['Jupiter']), color=couleurs['Jupiter'])
plt.text(Ljupiter.mean(), 1.1, "Jupiter", ha='right',va='center', rotation=np.degrees(Ljupiter.mean()))
ax.annotate("", xy=(Lsaturne.mean(), 1.2), xytext=(0, 0),arrowprops=dict(arrowstyle="->", color=couleurs['Saturne']), color=couleurs['Saturne'])
plt.text(Lsaturne.mean(), 1.1, "Saturne", ha='right',va='center',rotation=np.degrees(Lsaturne.mean()))

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

Soyez le premier à commenter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.