import numpy as np
import matplotlib.pyplot as plt
from astropy.modeling import models, fitting
from astroquery.vizier import Vizier
import scipy.optimize
catalog = Vizier.get_catalogs('V/50')
print(catalog)
Noms et type de contenus des deux tables accessibles par ce catalogue.
D'abord le catalogue.
catalog[0].dtype
Ensuite les notes associées aux données précédentes.
catalog[1].dtype
Première interrogation : à quoi ressemblent les données contenues dans ce catalogue ? Chargeons les cinq premières lignes en sélectionnant trois champs : type spectral, indice de couleur et magnitude visuelle.
cinq = catalog[0]['SpType', 'B-V','Vmag']
cinq[0:5]
print(cinq[0:5])
Remarques :
SpType
de type string
contient 20 caractères et est aligné à droite. Cela a pour conséquence :champ[0]
: le premier caractère peut être un espace.champ.strip()
.Exemple d'application : élimination des espaces devant le type spectral de la première ligne.
catalogue= catalog[0]['SpType', 'B-V','Vmag']
premier = catalogue[0][0] # premier champ de la première ligne
premier.strip() # on élimine les espaces inutiles
Prenons les dix premières lignes du catalogue et recherchons les étoiles de type G
et listons les trois mêmes champs, mais sans les en-têtes.
for i in range(10):
spectre = catalogue[i]['SpType']
if 'G' == spectre.strip()[0]:
print(catalogue[i][0], catalogue[i][1], catalogue[i][2])
Les lectures conseillées nous ont appris que :
O
sont très bleues. On pourrait penser que leur indice B-V
serait positif.G
sont jaunes. On pourrait penser que leur indice B-V
serait autour de zéro.M
sont rouges. On pourrait penser que leur indice B-V
serait négatif.Comment vérifier ces affirmations ? Nous allons réaliser la moyenne des valeurs de B-V
pour chacun de ces types.
Remarques sur ce code :
.filled(np.nan)
.non_vide
.arrO, arrG, arrM
) qui sont ensuite converties en numpy.array
. Cela permettra par la suite de tracer un diagramme HR par type spectral.Remarque : ce site en français m'a aidé.
Vizier.ROW_LIMIT = -1
recup = Vizier.get_catalogs('V/50')[0]
nb = len(recup) # nombre d'enregistrements
# ~ nb = 20
catalog = recup['SpType', 'B-V','Vmag']
autres = 0 # étoiles qui ne sont ni O, ni G, ni M
catalog['B-V'].filled(np.nan) # une valeur connue dans ...
catalog['Vmag'].filled(np.nan) # ... les colonnes masquées
arrO, arrG, arrM = [], [], []
def non_vide(ligne):
""" une ligne utilisable contient
trois éléments non vides """
if len(ligne[0].strip()) > 0:
if ligne[1]!= np.nan and ligne[2]!= np.nan:
return True
else:
return False
else:
return False
for i in range(nb):
if non_vide(catalog[i]):
spectre = catalog[i]['SpType'].strip()
element = [catalog[i]['B-V'],catalog[i]['Vmag']]
if 'O' == spectre[0]:
arrO.append(element)
elif 'G' == spectre[0]:
arrG.append(element)
elif 'M' == spectre[0]:
arrM.append(element)
else:
autres += 1
# transformation en numpy.arrays
o = np.array(arrO)
g = np.array(arrG)
m = np.array(arrM)
# Affichage des moyennes
print("Type O :", np.mean(o,0)[0])
print("Type G :", np.mean(g,0)[0])
print("Type M :", np.mean(m,0)[0])
O
sont très bleues. Leur indice B-V
est négatif ou proche de zéro.G
sont jaunes. Leur indice B-V
est positif (> 0.5)M
sont rouges. Leur indice B-V
est positif (> 1.5).En fait, cela peut se comprendre : dans les étoiles rouges, la part de vert est réduite et, donc bleu - vert
tend à augmenter.
O
sont marquées d'un point bleu.G
sont marquées d'un point jaune.M
sont marquées d'un point rouge.tout = recup['B-V','Vmag']
xo = [arrO[i][0] for i in range(len(arrO))]
yo = [arrO[i][1] for i in range(len(arrO))]
xg = [arrG[i][0] for i in range(len(arrG))]
yg = [arrG[i][1] for i in range(len(arrG))]
xm = [arrM[i][0] for i in range(len(arrM))]
ym = [arrM[i][1] for i in range(len(arrM))]
fig = plt.figure(1, figsize=(5,6)) # dimensions du cadre
plt.plot(tout['B-V'], tout['Vmag'], linestyle='none', marker = 'o', c = 'black', markersize = 1)
plt.plot(xo, yo, linestyle='none', marker = 'o', c = 'blue', markersize = 2)
plt.plot(xg, yg, linestyle='none', marker = 'o', c = 'yellow', markersize = 1)
plt.plot(xm, ym, linestyle='none', marker = 'o', c = 'red', markersize = 1)
axes = plt.gca()
axes.set_xlim(-0.5,2.5) # échelle des températures
axes.set_xlabel("Couleur : B-V")
axes.set_ylim(-2, 9) # échelle des magnitudes
axes.set_ylabel("Magnitudes")
# affiche les points dans l'ordre du diagramme HR
axes.invert_yaxis()
Cela ne ressemble pas à un diagramme HR. Pourquoi ? Les magnitudes utilisées sont les magnitudes visuelles apparentes et non pas absolues. La notion de distance n'intervient donc pas et, au lieu de s'étirer de haut en bas, notre représentation est verrouillée entre les magnitudes -2 et 8.
Les types spectraux s'alignent bien sur les indices de couleur. Le graphique ci-dessus montre distinctement trois barres verticales de couleur. Si l'on regarde les moyennes calculées précédemment, la barre bleue s'aligne sur x=0, la jaune autour de 0,9, la rouge autour de 1,6.
Il sera utile de refaire ces manipulations avec un catalogue qui fournit la manitude absolue, tel le V/137D
(Extended Hipparcos Compilation (XHIP) (Anderson+, 2012))