Creador: Luis Alberto León Andonayre
Institución: Universidad Nacional Mayor de San Marcos
email: luis.leon20@unmsm.edu.pe
El diagrama de Hertzsprung-Russell 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. De forma más sencilla, en el gráfico se traza cada estrella para medir su brillo en comparación con su temperatura (color).
En el presente notebook se muestra una recreacion de este diagrama con datos de estrellas. Para manejar los datos se usa Pandas y para la figura estatica y animada Matplotlib
Librerias importadas
import pandas as pd
import matplotlib.pyplot as plt
Leyendo los datos a través de Pandas
data_ms = pd.read_csv('data/ms.csv')
data_dwarfs = pd.read_csv('data/dwarfs.csv')
data_giants = pd.read_csv('data/giants.txt',sep=' ')
data_supergiants = pd.read_csv('data/supergiants.txt',sep=' ')
Ya que el objetivo es representar a las estrellas en conjuntos. Se puede unir las distintas bases de datos. En este caso se concatenan los datos de las estrellas a excepción de las enenas blancas. Ya que para recrear la imagen deseada es necesario dejarlas de color blanco y a las otras estrellas de color.
data = pd.concat([data_ms,data_giants,data_supergiants])
El gráfico está basado en una dispersión (de datos) en donde el eje X es la temperatura de las estrellas, el eje Y la luminosidad solar de estas. Además cada estrella posee un tamaño distinto proporcional al radio s que posee. El factor 9.5 no posee ningún significado física, solo el de representa mejor de manera estética la representación. La gráfica posee una escala logarítmica a lo largo del eje Y y en el eje X la temperatura está invertida, i.e. la temperatura va disminuyendo mientras más se aleja del origen de coordenadas.
fig, ax = plt.subplots(figsize=(15,10))
ax.scatter(data['temp'], # Eje x
data['lum'], # Eje y
s = 9.5*data['radius'],
c = data['temp'], # color de acuerdo a la temperatura
cmap = 'RdYlBu') # mapa del color para la temperatura
ax.scatter(data_dwarfs['temp'], # Eje x
data_dwarfs['lum'], # Eje y
s = 9.5*data_dwarfs['radius'], # radio de las bolitas
c = 'white', # color
edgecolors = 'black') #borde de las bolitas
ax.semilogy() # Escala logarítmica en Y
ax.invert_xaxis() # Eje X invertido
plt.xlabel('Temperatura (K)',
fontsize = 20) #Etiquetas eje X - temperatura
plt.ylabel('Luminosidad ($L_{solar}$)',
fontsize = 20) # Etiqueta eje Y - luminosidad solar
# Etiquetas para colocar nombre de categorías
## plt.text (punto en X, punto en Y, "Etiqueta",
#Tamaño de letra, Estilo negrita)
plt.text(4200, 1.7*10**1, 'Red Giants',
fontsize = 14, fontweight='bold')
plt.text(9000, 1, 'Main Sequence',
fontsize = 14, fontweight='bold')
plt.text(8000, 10**(-3), 'White Dwarfs',
fontsize = 14, fontweight='bold')
plt.text(9500, 10**6, 'Blue Giants',
fontsize = 14, fontweight='bold')
plt.text(4800, 5*10**4 , 'Red Supergiants',
fontsize = 14, fontweight='bold')
#comando para imprimir el gráfico
plt.show()
Para mostrar la animación es necesario la librería FuncAnimation
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots(figsize=(15,10))
ax.semilogy() # Escala logarítmica en Y
ax.invert_xaxis() # Eje X invertido
# Etiquetas para colocar nombre de categorías
## plt.text (punto en X, punto en Y, "Etiqueta", Tamaño de letra, Estilo negrita)
plt.xlabel('Temperatura (K)',
fontsize = 20)
plt.ylabel('Luminosidad ($L_{solar}$)',
fontsize = 20)
#ploteo inicial
plot = ax.scatter(data['temp'].iloc[0],
data['lum'].iloc[0],
s=data['radius'].iloc[0],
c = 'red')
#animación
def animation(i):
x = data['temp'].iloc[:i]
y = data['lum'].iloc[:i]
color = data['temp'].iloc[:i]
radio = 9.5*data['radius'].iloc[:i]
plot = ax.scatter(x,
y,
s = radio,
c = color,
cmap = 'RdYlBu')
if i>=100:
x = data_dwarfs['temp'].iloc[:i-99]
y = data_dwarfs['lum'].iloc[:i-99]
radio = data_dwarfs['radius'].iloc[:i-99]*9.5
plot = ax.scatter(x,
y,
s = radio,
c = 'white',
edgecolors='black') #plotea las enanas blancas al final
if i>60:
plt.text(9000, 1, 'Main Sequence',
fontsize = 14, fontweight='bold') # etiqueta
if i>90:
plt.text(4200, 1.7*10**1, 'Red Giants',
fontsize = 14, fontweight='bold') # etiqueta
if i>95:
plt.text(4800, 5*10**4 , 'Red Supergiants',
fontsize = 14, fontweight='bold') # etiqueta
if i>100:
plt.text(9500, 10**6, 'Blue Giants',
fontsize = 14, fontweight='bold') # etiqueta
if i>105:
plt.text(8000, 10**(-3), 'White Dwarfs',
fontsize = 14, fontweight='bold') # etiqueta
return plot,
N_points = 130
animacion = FuncAnimation(fig,
animation,
frames = N_points, #retardante de la imagen
interval = 100,
blit = True)
animacion.save('Hertzsprung-Russell.gif') #guarda la animación como .gif
plt.close(fig)
MovieWriter ffmpeg unavailable; using Pillow instead.