Data
. Cada tabla contiene
las informaciones sobre un tipo de estrellas según indican los nombres de
archivo. La información viene en 3 columnas: luminosidad en luminosidades
solares, Temperatura en Kelvin y Radio de la estrella en unidades arbitrariasLo primero que se observa al mirar la gráfica es una gran línea diagonal que va desde la parte superior izquierda a la parte inferior derecha. Esta es la famosa “Secuencia principal”, en la cual se reúnen una gran parte de las estrellas, incluida la nuestra, el Sol. El factor común de las estrellas que forman parte de esta secuencia es que todas producen energía mediante la fusión de hidrógeno para producir helio en su interior. Lo que diferencia realmente, entre otras cosas, a las distintas estrellas que forman parte de la secuencia principal es su masa.
Alejados de la gran secuencia principal, podemos ver otros sectores, situados tanto por encima como por debajo:
Ref: Cien años del diagrama de Hertzsprung-Russell, el gráfico que organizó las estrellas
Se importan las librería matplotlib para realizar los gráficos, IPython.display para la animación final, y time para darle cadencia a la animación mencionada
import matplotlib.pyplot as plt # para los plots
import matplotlib
matplotlib.rcParams['figure.dpi']=300
# visualización de alta resolución
import numpy as np
from IPython.display import clear_output
# para que no se acumulen los gráficas y
# se produsca el efecto animado
from time import sleep # tiempo de espera
Se recogen los datos de los diferentes tipos de estrellas en "arrays" de numpy y luego se concatenan en el "array" stars.
También se sabe que la primera línea de los archivos "data" contiene los nombres de las variables "lum,temp,radius" por lo tanto no se toma en cuenta esa línea
dwarfs = np.genfromtxt('data/dwarfs.csv',delimiter=',',
skip_header=1)
# "skip header" para no recoger los nombres de las variables
giants = np.genfromtxt('data/giants.txt',skip_header=1)
ms = np.genfromtxt('data/ms.csv',delimiter=',',skip_header=1)
supergiants = np.genfromtxt('data/supergiants.txt',
skip_header=1)
stars = np.concatenate([dwarfs, giants, ms, supergiants],
axis = 0)
Se crea un nuevo conjunto de "arrays" para diferenciar la variable Temperatura (stars[:,1]) de la variable Color de las estrellas, ya que difieren con respecto a la categoría "Enanas blancas" para las que el Color es constante (blanco)
dwarfs_colors=dwarfs[:,1].copy()
giants_colors=giants[:,1].copy()
ms_colors=ms[:,1].copy()
supergiants_colors=supergiants[:,1].copy()
Se escoge el siguiente valor por ser el valor intermedio de la variable Temperatura, por lo que corresponderá al color blanco luego de la normalización en cmap
Luego se concatenan todos los valores Color en el "array" stars_colors
color_white = (np.min(stars[:,1]) + np.max(stars[:,1]))/2
dwarfs_colors = [color_white for a in dwarfs_colors]
stars_colors = np.concatenate([dwarfs_colors, giants_colors,
ms_colors, supergiants_colors])
Se plotea Temperatura([stars[:,0]]) vs. Luminosidad([stars[:,1]]), tomando en cuenta:
al representar los puntos que señalan sus posiciones en el Diagrama Hertzprung-Russell
plt.scatter([stars[:,1]], [stars[:,0]], marker='o',
s=[2.5*stars[:,2]], c=[stars_colors], cmap="RdBu",
linewidths=0.5, edgecolors="gray")
# "RdBu" es el espectro que va del color Rojo al Azul pasando
# por el color Blanco intermedio
plt.gca().invert_xaxis()
# Es necesario invertir el eje X
plt.xscale("log")
plt.yscale("log") # Se establecen los dos ejes logarítmicos
plt.xlabel("Temperature (K)")
plt.ylabel("Luminosity $(L_{sum})$")
# Se colocan los nombres de los grupos de estrellas
plt.gca().text(10e3, 10e4, "Blue Giants",fontsize=10)
plt.gca().text(0.5*10e3, 0.3*10e4, "Red Supergiants",fontsize=10)
plt.gca().text(0.5*10e3, 0.3*10e2, "Red Giants",fontsize=10)
plt.gca().text(1.3*10e3, 3*10e-1, "Main Sequence",fontsize=10)
plt.gca().text(0.52*10e3, 10e-4, "Main Sequence",fontsize=10)
plt.gca().text(0.8*10e3, 10e-4, "White Dwarfs",fontsize=10)
plt.show()
Para evitar dificultades con cmap se realiza la animación sin la representación de colores hasta la iteración j=3.
Y para respetar las posiciones de los textos que señalan los grupos de estrellas (Blue Giants, Main Sequence, etc.) se introducen estos solo en el último ploteo
for j in range(len(stars)):
clear_output(wait=True)
# para no acumular los gráficos y vaciar las variables
if j<4:
plt.scatter([stars[:j+1,1]], [stars[:j+1,0]],
marker='o', s=[2.5*stars[:j+1,2]],
linewidths=0.5, edgecolors="gray")
# en la última interación se muestran los nombres de los
# tipos de estrellas
elif j==len(stars)-1:
plt.gca().text(10e3, 10e4, "Blue Giants",fontsize=10)
plt.gca().text(0.5*10e3, 0.3*10e4, "Red Supergiants",fontsize=10)
plt.gca().text(0.5*10e3, 0.3*10e2, "Red Giants",fontsize=10)
plt.gca().text(1.3*10e3, 3*10e-1, "Main Sequence",fontsize=10)
plt.gca().text(0.52*10e3, 10e-4, "Main Sequence",fontsize=10)
plt.gca().text(0.8*10e3, 10e-4, "White Dwarfs",fontsize=10)
plt.scatter([stars[:j+1,1]], [stars[:j+1,0]],
marker='o', s=[2.5*stars[:j+1,2]],
c=[stars_colors[:j+1]], cmap="RdBu",
linewidths=0.5, edgecolors="gray")
else: # a partir de la iteración j=4 son visibles los
#colores
plt.scatter([stars[:j+1,1]], [stars[:j+1,0]],
marker='o', s=[2.5*stars[:j+1,2]],
c=[stars_colors[:j+1]], cmap="RdBu",
linewidths=0.5, edgecolors="gray")
plt.gca().invert_xaxis()
plt.xscale("log")
plt.yscale("log")
plt.xlabel("Temperature (K)")
plt.ylabel("Luminosity $(L_{sum})$")
plt.show()
sleep(0.05) # espera un poco antes del siguiente paso
#(probablemente no necesario)