Comparaison des planètes du Système Solaire

Où l’on s’amuse à illustrer graphiquement des différences entre les planètes du Système Solaire.

Ayant trouvé un “dataset” de données sur les planètes du Système Solaire, j’ai imaginé des représentations graphiques de données, avec Python et ses modules Matplotlib et Pandas, pour visualiser les différences entre les planètes. Ce sont des exemples simples d’utilisation de fonctionnalités de ces modules.

La source des données est un fichier de format .CSV trouvé ici : https://devstronomy.com/#/datasets

et que voici :

Ce fichier donne les valeurs de quelques paramètres :

  • masse
  • diamètre
  • densité
  • distance au Soleil
  • gravité
  • période orbitale
  • période de rotation
import matplotlib.pyplot as plt
import pandas as pd
table=pd.read_csv("planets.csv", delimiter=',',
skiprows=1, #retirer la 1e ligne de commentaires
skipfooter=1#retirer Pluton
)
nom=table["planet"]
gravite=table["gravity"]

#palette de couleurs :
couleurs=[
'lightcyan', 
'steelblue', 
'azure', 
'lightblue', 
'thistle', 
'indigo',
'lavender',
'slateblue',
]

#création d'une liste des initiales des planètes :
initiale=[]
for i in range(len(nom)):
    initiale.append(nom[i][0])

fig=plt.figure(figsize=(6, 5))
plt.title(r"Comparaison des gravités ($N\cdot kg^{-1}$)")

plt.xticks(range(len(nom)), initiale)
for n in range(len(gravite)):
    plt.scatter(n, gravite[n], s=50, c=couleurs[n], edgecolor='black')

fig.savefig("Gravites.png", dpi=200)
plt.show()

Dans ce dernier exemple et le suivant, j’ai remplacé les graduations en x par l’initiale (ou le nom complet) des planètes. En effet, dans la commande plt.xticks() de matplotlib, on peut fournir une liste de chaînes de caractères à utiliser en guise d’étiquettes des graduations, en lieu et place de valeurs numériques.

import matplotlib.pyplot as plt
import pandas as pd

table=pd.read_csv("planets.csv", delimiter=',', 
skiprows=1,#retirer 1e ligne de commentaires
skipfooter=1#retirer Pluton
)

nom=table["planet"]
densite=table["density"]/1e3
nom=table["planet"].to_numpy()

#palette de couleurs :
couleurs=[
'lightcyan', 
'steelblue', 
'azure', 
'lightblue', 
'thistle', 
'indigo',
'lavender',
'slateblue',
]

fig=plt.figure(figsize=(6, 6), tight_layout=True)
plt.title("Comparaison des densités")

plt.xticks(range(len(nom)), nom, rotation=-90)
for n in range(len(densite)):
    plt.scatter(n, densite[n], s=50, c=couleurs[n], ec='black')

fig.savefig("Densites.png", dpi=200)
plt.show()
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import pandas as pd
import numpy as np
table=pd.read_csv("planets.csv", delimiter=',', 
skiprows=1, #retirer 1e ligne de commentaires
skipfooter=1#retirer Pluton
)

diametre=table["diameter"]/1e3#en milliers de km
nom=table["planet"].to_numpy()

#palette de couleurs par planète :
couleurs=[
'lightcyan', 
'steelblue', 
'azure', 
'lightblue', 
'thistle', 
'indigo',
'lavender',
'slateblue',
]

fig=plt.figure(figsize=(8, 8))
ax=plt.subplot()
plt.title("Diamètres relatifs des planètes")
plt.xlabel(r"diamètre ($\times 10^3$ km)")
ax.set_aspect('equal')
for n in range(len(nom)):
    cercle=Circle((diametre[n]/2,0 ), diametre[n]/2, fc=couleurs[n], ec='black', zorder=-diametre[n], label=nom[n])
    ax.add_patch(cercle)

plt.xlim(-max(diametre)*1*0.2, max(diametre)*1*1.1)
plt.ylim(-max(diametre)/2*1.1, max(diametre)/2*1.1)
plt.yticks([])
plt.xticks(np.arange(0, max(diametre)+10, 10))

plt.legend()
fig.savefig("Diametres.png", dpi=250)
plt.show()

Dans ce dernier graphique, l’argument “zorder” permet d’imposer l’ordre de superposition des cercles : plus la valeur de zorder est élevée, plus le cercle est tracé à l’avant. Ici, j’ai fixé pour zorder une valeur égale à l’opposé du diamètre des planètes, afin qu’aucune planète n’en masque une autre.

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
table=pd.read_csv("planets.csv", delimiter=',',
skiprows=1, #éviter la 1e ligne de commentaire
skipfooter=1#retirer Pluton
)

distSoleil=table["distance_from_sun"]/149.5#(en UA)
nom=table["planet"].to_numpy()

#palette de couleurs  par planète :
couleurs=[
'lightcyan', 
'steelblue', 
'azure', 
'lightblue', 
'thistle', 
'indigo',
'lavender',
'slateblue',
]

#création d'une liste des initiales des planètes :
initiale=[]
for i in range(len(nom)):
    initiale.append(nom[i][0])

fig=plt.figure(figsize=(20, 2))
ax=plt.subplot()
plt.title("Distances au Soleil")
plt.xlabel("distance au Soleil (UA)")
ax.set_aspect('equal')
for n in range(len(nom)):
    plt.scatter(distSoleil[n], 0, c=couleurs[n], ec='black')
    plt.text(distSoleil[n], 0.2, initiale[n], va='bottom', ha='center')

plt.xlim(0, max(distSoleil)*1.01)
plt.ylim(-1, 1)
plt.xticks(np.arange(0, max(distSoleil)+1, 1))
plt.yticks([])

fig.savefig("Distances.png", dpi=200)
plt.show()
import matplotlib.pyplot as plt
from matplotlib.patches import Wedge
import pandas as pd
import numpy as np
table=pd.read_csv("planets.csv", delimiter=',',
skiprows=1, #retirer la 1e ligne de commentaires
skipfooter=1,#retirer Pluton
engine='python'
)

nom=table["planet"]
distSoleil=table["distance_from_sun"]/149.5#(en UA)
Torbitale=table["orbital_period"]#en jours terrestres
nom=table["planet"].to_numpy()

#palette de couleurs :
couleurs=[
'lightcyan', 
'steelblue', 
'azure', 
'lightblue', 
'thistle', 
'indigo',
'lavender',
'slateblue',
]
#création d'une liste des initiales des planètes :
initiale=[]
for i in range(len(nom)):
    initiale.append(nom[i][0])

fig=plt.figure(figsize=(6, 6), tight_layout=True)
plt.suptitle("Comparaison des périodes orbitales :\n angle décrit par les planètes sur leur orbite")

ax=plt.subplot(121)
plt.title("planètes rocheuses")
ax.set_aspect('equal')
plt.xlabel("En 44 jours terrestres")
plt.xticks([])
plt.yticks([])
for n in range(4):
    angle=Torbitale[0]*180/Torbitale[n]
    secteur=Wedge((0, 0), distSoleil[n], 90, 90+angle, fc=couleurs[n], ec='black', zorder=10-n)
    plt.text(0.01, distSoleil[n], nom[n], fontsize=7, va='center')
    plt.text(-distSoleil[n]*np.sin(np.radians(angle)), distSoleil[n]*np.cos(np.radians(angle)), "%s°"%(round(angle, 1)), fontsize=7, ha='right', va='top', zorder=10)
    ax.add_patch(secteur)
    
etendue=2
plt.xlim(-etendue/2, etendue/4)
plt.ylim(-etendue/4, etendue)

ax2=plt.subplot(122)
plt.title("planètes gazeuses")
ax2.set_aspect('equal')
plt.xlabel("En 5.9 années terrestres")
plt.xticks([])
plt.yticks([])
for n in range(4, 8):
    angle=Torbitale[4]*180/Torbitale[n]
    secteur=Wedge((0, 0), distSoleil[n], 90, 90+angle, fc=couleurs[n], ec='black', zorder=10-n)
    plt.text(0.01, distSoleil[n], nom[n], fontsize=7, va='center')
    plt.text(-distSoleil[n]*np.sin(np.radians(angle)), distSoleil[n]*np.cos(np.radians(angle)), "%s°"%(round(angle, 1)), fontsize=7, ha='right', va='top', zorder=10)
    ax2.add_patch(secteur)
    
etendue=4e1
plt.xlim(-etendue/2, etendue/4)
plt.ylim(-etendue/4, etendue)

fig.savefig("PeriodesOrbitales.png", dpi=200)
plt.show()

Visualisation de la 3e loi de Kepler :

#Appel des modules :
import matplotlib.pyplot as plt
from scipy.stats import linregress
import pandas as pd
import numpy as np

#extraction des données du fichier .csv :
table=pd.read_csv("planets.csv", delimiter=',', 
skiprows=1, #éviter la 1e ligne de commentaire
skipfooter=1#retirer Pluton
)

nom=table["planet"]
distSoleil=table["distance_from_sun"]*1e9#en mètres
Torbitale=table["orbital_period"]*24*3600#en secondes

nom=table["planet"].to_numpy()#Pour changer le format en simple liste de chaînes de caractères.

#palette de couleurs :
couleurs=[
'lightcyan', 
'steelblue', 
'azure', 
'lightblue', 
'thistle', 
'indigo',
'lavender',
'slateblue',
]
#création d'une liste des initiales des planètes :
initiale=[]
for i in range(len(nom)):
    initiale.append(nom[i][0])

fig=plt.figure(figsize=(6, 6), tight_layout=True)
plt.suptitle("Relation entre période de révolution et distance au Soleil")

ax=plt.subplot(211)
for n in range(len(nom)):
    plt.scatter(distSoleil[n], Torbitale[n], c=couleurs[n])
    plt.text(distSoleil[n], Torbitale[n], initiale[n])

#modelisation (d'après les résultats du 2e graphe) :
X=np.arange(0, 4.5e12, 1e8)
modele=np.sqrt(2.939e-19*X**3)
plt.plot(X, modele, '--', zorder=0)

plt.xlabel("distance au Soleil (m)")
plt.ylabel("Période orbitale (s)")

ax2=plt.subplot(212)
plt.title("Loi de Kepler")
#regression linéaire :
x=distSoleil**3
y=Torbitale**2
modele=linregress(x, y)
pente=modele.slope
ordo=modele.intercept
R=modele.rvalue
couleurmodele='red'

for n in range(len(nom)):
    plt.scatter(x[n], y[n], c=couleurs[n])
    plt.text(x[n], y[n], initiale[n])
plt.plot(x, pente*x+ordo, c=couleurmodele, zorder=0)#regression
plt.xlabel(r"$distance^3$")
plt.ylabel(r"$Période^2$")
plt.text(0.9, 0.5, "pente : %.3e"%(pente), c=couleurmodele, transform=ax2.transAxes, ha='right')
plt.text(0.9, 0.4, "coeff. : %1.8f"%(R), c=couleurmodele, transform=ax2.transAxes, ha='right')

fig.savefig("Kepler.png", dpi=200)
plt.show()

Soyez le premier à commenter

Laisser un commentaire