Es un gráfico de dispersión de estrellas indicando la relación entre las magnitudes absolutas o luminosidades de las estrellas en comparación con sus clasificaciones espectrales o las temperaturas efectivas. Herramienta fundamental para el estudio de la evolución estelar. En el gráfico se traza cada estrella para medir su brillo en comparación con su temperatura, la temperatura representada a través del color.
Las estrellas de mayor luminosidad están situadas en la parte superior del diagrama, y las estrellas con una temperatura superficial elevada están en el lado izquierdo. En el eje horizontal se tiene la escala de temperatura, que va desde las temperaturas más elevada hasta las más bajas. Por su parte el eje vertical mide la luminosidad.
Se observa que las estrellas no se distribuyen aleatoriamente en dicho diagrama, sino que tienden a agruparse en ciertas regiones que se denominan:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.colors import ListedColormap
from celluloid import Camera
Usando la función genfromtxt de la librería numpy. Saltando la línea del encabezado que especifica el nombre de cada columna.
dwarfs = np.genfromtxt("data/dwarfs.csv", delimiter = ",", skip_header=1)
giants = np.genfromtxt("data/giants.txt", delimiter = " ", skip_header=1)
ms = np.genfromtxt("data/ms.csv", delimiter = ",", skip_header=1)
supergiants = np.genfromtxt("data/supergiants.txt", delimiter = " ", skip_header=1)
Crear una lista de colores para cada una de las clasificaciones de estrellas.
# Supergiants
colors_sup = ['OrangeRed', 'DarkOrange', 'orange', 'LightBlue', 'SkyBlue', 'DodgerBlue']
# Main Sequence
colors_ms = ['OrangeRed', 'DarkOrange', 'orange', 'yellow', 'LightCyan', 'SkyBlue', 'DodgerBlue', 'CornflowerBlue',
'MediumBlue']
# Giants
colors_g = ['OrangeRed', 'DarkOrange', 'orange', 'gold', 'yellow']
# Dwarfs
colors_d = ['white','LightCyan']
# Tamaño del gráfico
plt.figure(figsize=(14, 9))
# Asignando el recuadro a una variable
ax = plt.subplot(111)
# Establecer los ejes
ax = plt.axes()
# Eliminar las líneas derecha y superior del recuadro
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
# Nombrar los ejes
ax.set_xlabel('Temperature (K)', fontsize=12, fontweight='bold')
ax.set_ylabel('Luminosity ($L_{sun}$)',fontsize=12, fontweight='bold')
# Establecer los límites de los ejes
ax.set_xlim(14000,2000)
ax.set_ylim(5*10**(-5), 2*10**6)
# Eje "y" en escala logarítmica
ax.set_yscale('log')
# Etiquetar los valores de los ejes
plt.yticks([10**(-4), 10**(-2), 1, 10**2, 10**4, 10**6],
[r'$\bf 10^{-4}$', r'$\bf 10^{-2}$', r'$\bf 1$', r'$\bf 10^{2}$', r'$\bf 10^{4}$', r'$\bf 10^{6}$' ])
plt.xticks([13000, 11000, 9000, 5000, 2500],
[r'$\bf 40000$', r'$\bf 20000$', r'$\bf 10000 $',r'$\bf 5000$',r'$\bf 2500$'])
# Graficar los datos para cada clasificación de estrellas
# Al tamaño de cada estrella se le agrega un factor multiplicativo de 5 para visualizarlas bien
plt.scatter(dwarfs[:,1], dwarfs[:,0], c= dwarfs[:,1], s= 5*dwarfs[:,2], cmap= ListedColormap(colors_d),
edgecolors="gray", alpha= 1)
plt.scatter(giants[:,1], giants[:,0], c= giants[:,1], s= 5*giants[:,2], cmap= ListedColormap(colors_g),
edgecolors= "gray", alpha= 1)
plt.scatter(supergiants[:,1], supergiants[:,0], c= supergiants[:,1], s= 5*supergiants[:,2],
cmap= ListedColormap(colors_sup), edgecolors= "gray", alpha= 1)
plt.scatter(ms[:, 1], ms[:,0], c= ms[:,1], s= 5*ms[:,2], cmap= ListedColormap(colors_ms), edgecolors= "gray", alpha= 1)
# Agregar etiquetas dentro del gráfico
plt.text(5000, 10**6 , 'Red Supergiants', fontweight='bold')
plt.text(4200, 2*10**1, 'Red Giants', fontweight='bold')
plt.text(5600, 2*10**(-4), 'Main Sequence', fontweight='bold')
plt.text(13000, 75, 'Main Sequence', fontweight='bold')
plt.text(9500, 10**6, 'Blue Giants', fontweight='bold')
plt.text(8000, 10**(-3), 'White Dwarfs', fontweight='bold')
# Mostrar el gráfico
plt.show()
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
En esta animación van apareciendo los puntos uno a uno para todas las clasificaciones de estrellas. Para realizar esta animación se importó la librería Celluloid. Celluloid permite generar animaciones mediante la captura de instantanias de los gráficos generados por matplotlib.
# Se definen todo los parámetros del gráfico como se hizo anteriormente
fig, ax = plt.subplots()
# Nombrar los ejes
ax.set_xlabel('Temperature (K)', fontsize=12, fontweight='bold')
ax.set_ylabel('Luminosity ($L_{sun}$)', fontsize=12, fontweight='bold')
# Establecer los límites de los ejes
ax.set_xlim(14000, 2000)
ax.set_ylim(5*10**(-5), 2*10**6)
# Eje "y" en escala logarítmica
ax.set_yscale('log')
# Etiquetar los valores de los ejes
plt.yticks([10**(-4), 10**(-2), 1, 10**2, 10**4, 10**6],
[r'$\bf 10^{-4}$', r'$\bf 10^{-2}$', r'$\bf 1$', r'$\bf 10^{2}$', r'$\bf 10^{4}$', r'$\bf 10^{6}$' ])
plt.xticks([13000, 11000, 9000, 5000, 2500],
[r'$\bf 40000$', r'$\bf 20000$', r'$\bf 10000 $',r'$\bf 5000$',r'$\bf 2500$'])
# Animación
camera = Camera(fig)
for i in range(len(ms)):
plt.scatter(ms[:i,1], ms[:i,0], c=ms[:i,1], cmap=ListedColormap(colors_ms), s= 2*ms[:i,2], edgecolors= "gray")
plt.scatter(dwarfs[:i,1], dwarfs[:i,0], c= dwarfs[:i,1], s = 2*dwarfs[:i,2], cmap= ListedColormap(colors_d),
edgecolors="gray")
plt.scatter(giants[:i,1], giants[:i,0], c= giants[:i,1], s = 2*giants[:i,2], cmap= ListedColormap(colors_g),
edgecolors="gray")
plt.scatter(supergiants[:i,1], supergiants[:i,0], c= supergiants[:i,1], s =2*supergiants[:i,2],
cmap=ListedColormap(colors_sup), edgecolors="gray")
# La cámaro toma la instantania del gráfico
camera.snap()
# Se crea la animación
animation = camera.animate()
# Agregar etiquetas dentro del gráfico
plt.text(5000, 5*10**4, 'Red Supergiants', fontweight='bold', fontsize=8)
plt.text(4000, 1.7*10**1, 'Red Giants', fontweight='bold', fontsize=8)
plt.text(5600, 2*10**(-4), 'Main Sequence', fontweight='bold', fontsize=8)
plt.text(13500, 55, 'Main Sequence', fontweight='bold', fontsize=8)
plt.text(9880,5*10**5,'Blue Giants', fontweight='bold', fontsize=8)
plt.text(8700, 10**(-3), 'White Dwarfs', fontweight='bold', fontsize=8)
# Crear la animación como un gif
animation.save('ENTREGA_HR.gif', writer = 'at')
plt.close(fig)
MovieWriter at unavailable; using Pillow instead.
En esta animación se van resaltando los círculos de la secuencia principal uno a uno.
# Se definen todo los parámetros del gráfico como se hizo anteriormente
fig = plt.figure(figsize=(12, 10))
fig, ax = plt.subplots()
# Nombrar los ejes
ax.set_xlabel('Temperature (K)', fontsize=12, fontweight='bold')
ax.set_ylabel('Luminosity ($L_{sun}$)',fontsize=12, fontweight='bold')
# Establecer los límites de los ejes
ax.set_xlim(14000,2000)
ax.set_ylim(5*10**(-5), 2*10**6)
# Eje "y" en escala logarítmica
ax.set_yscale('log')
# Etiquetar los valores de los ejes
plt.yticks([10**(-4), 10**(-2), 1, 10**2, 10**4, 10**6],
[r'$\bf 10^{-4}$', r'$\bf 10^{-2}$', r'$\bf 1$', r'$\bf 10^{2}$', r'$\bf 10^{4}$', r'$\bf 10^{6}$' ])
plt.xticks([13000, 11000, 9000, 5000, 2500],
[r'$\bf 40000$', r'$\bf 20000$', r'$\bf 10000 $',r'$\bf 5000$',r'$\bf 2500$'])
# Agregar etiquetas dentro del gráfico
plt.text(5000, 5*10**4, 'Red Supergiants', fontweight='bold', fontsize=8)
plt.text(4000, 1.7*10**1, 'Red Giants', fontweight='bold', fontsize=8)
plt.text(5600, 2*10**(-4), 'Main Sequence', fontweight='bold', fontsize=8)
plt.text(13500, 55, 'Main Sequence', fontweight='bold', fontsize=8)
plt.text(9880,5*10**5,'Blue Giants', fontweight='bold', fontsize=8)
plt.text(8700, 10**(-3), 'White Dwarfs', fontweight='bold', fontsize=8)
# Se grafican todas las estrellas
scat_ms = plt.scatter(ms[:,1], ms[:,0], c= ms[:,1], cmap= ListedColormap(colors_ms), s= 2*ms[:,2], edgecolors= "gray")
plt.scatter(dwarfs[:,1], dwarfs[:,0], c= dwarfs[:,1], cmap= ListedColormap(colors_d), s= 2*dwarfs[:,2],
edgecolors= "gray")
plt.scatter(giants[:,1], giants[:,0], c= giants[:,1], cmap= ListedColormap(colors_g), s= 2*giants[:,2],
edgecolors= "gray")
plt.scatter(supergiants[:,1], supergiants[:,0], c= supergiants[:,1], cmap= ListedColormap(colors_sup),
s= 2*supergiants[:,2], edgecolors= "gray")
# Animación
def animate_blit(i):
# Para main sequence
sizes_ms = scat_ms.get_sizes()
sizes_ms[i] = 50
scat_ms.set_sizes(sizes_ms)
return scat_ms,
num_points = range(len(ms))
ani = FuncAnimation(fig, animate_blit, num_points ,blit=True, repeat=True)
# Guardar la animación
ani.save('ENTREGA_HR_animacion2.gif')
plt.close(fig)
MovieWriter ffmpeg unavailable; using Pillow instead.
<Figure size 864x720 with 0 Axes>