Muestra la relación entre la magnitud absoluta y la clase espectral de las estrellas. La magnitud absoluta hace referencia al brillo/luminosidad de la estrella y se define como la magnitud aparente a una distancia de $10 parsecs$ de la estrella.
La magnitud aparente esta relacionada con el logartimo de la densidad de flujo de la estrella.
La clase espectral habla de la composición química de las estrellas.
** $1 pc = 3.26\hspace{0.2cm} light-years = 206,000 \hspace{0.2cm} au = 30.9 \hspace{0.2cm} trillion \hspace{0.2cm} km $ [1]
La gran mayoria de las estrella se localiza dentro de la diagonal, conocida como secuencia principal, i.e., el Sol se encuentra en la mitad de esta diagonal.
Las estrellas amarillas y rojas se localizan en el grupo de las estrellas gigantes, estas suelen ser una 100 veces mas brillantes que el Sol
Las estrellas rojas mas brillantes son las que se encuentran dentro de grupo de supergigantes, un ejemplo es Betelgeuze, 20.000 veces mas brillante que el Sol y con un radio de 400 veces el radio solar.
Las enanas blancas son númerosas, sin embargo son muy tenues y por lo tanto dificiles de observar.
Fuente: Fundamental Astronomy, H. Karttunen, et al., editores, Springer-Verlag, New York 2007
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors
from matplotlib import cm
from matplotlib.animation import FuncAnimation
#%matplotlib notebook
Se que no hemos visto pandas, pero la verdad es que soy muy fan de la libreria jaja
dwarfs = pd.read_csv('data/dwarfs.csv')
print(len(dwarfs))
dwarfs
6
lum | temp | radius | |
---|---|---|---|
0 | 0.000109 | 5050.644696 | 7.096930 |
1 | 0.000128 | 5967.543450 | 4.583996 |
2 | 0.000230 | 6674.161524 | 4.151078 |
3 | 0.000269 | 7216.762974 | 3.491754 |
4 | 0.000472 | 7795.184395 | 3.472736 |
5 | 0.000613 | 8402.695283 | 3.077338 |
ms = pd.read_csv('data/ms.csv')
print(len(ms))
ms.head()
90
lum | temp | radius | |
---|---|---|---|
0 | 0.000776 | 3577.003926 | 0.814703 |
1 | 0.002638 | 3691.168543 | 1.209778 |
2 | 0.006823 | 3793.506494 | 1.630027 |
3 | 0.019733 | 3862.471423 | 2.361574 |
4 | 0.040402 | 3963.530109 | 2.910924 |
giants = pd.read_csv('data/giants.txt', sep=' ')
print(len(giants))
giants.head()
5
lum | temp | radius | |
---|---|---|---|
0 | 304.228573 | 3654.601099 | 145.483474 |
1 | 58.884366 | 3808.609875 | 66.642938 |
2 | 9.246982 | 3991.751692 | 27.603430 |
3 | 58.505945 | 4164.818180 | 50.832968 |
4 | 32.033176 | 4425.773883 | 33.290931 |
supergiants = pd.read_csv('data/supergiants.txt', sep=' ')
print(len(supergiants))
supergiants.head()
5
lum | temp | radius | |
---|---|---|---|
0 | 359749.335156 | 3801.042587 | 278.055832 |
1 | 416869.383470 | 4398.962354 | 190.278395 |
2 | 1000000.000000 | 5465.163392 | 140.809113 |
3 | 920449.571753 | 7837.395137 | 46.187556 |
4 | 779830.110523 | 10200.701561 | 19.604244 |
Valores máximos y mínimos
def max_y_min(tabla):
lum_min, lum_max = min(tabla['lum']), max(tabla['lum'])
temp_min, temp_max = min(tabla['temp']), max(tabla['temp'])
return lum_min, lum_max, temp_min, temp_max
Enanas blancas
d_lum_min, d_lum_max, d_temp_min, d_temp_max = max_y_min(dwarfs)
Secuencia principal
ms_lum_min, ms_lum_max, ms_temp_min, ms_temp_max = max_y_min(ms)
Gigantes
g_lum_min, g_lum_max, g_temp_min, g_temp_max = max_y_min(giants)
Supergigantes
sg_lum_min, sg_lum_max, sg_temp_min, sg_temp_max = max_y_min(supergiants)
A continuación hago el diagrama ploteando cada tabla de manera individual, al hacerlo así no puedo acoplar de manera sencilla el color de las estrellas
fig, ax = plt.subplots(figsize=[8,5])
xmin = min( d_temp_min, ms_temp_min, g_temp_min, sg_temp_min )
xmax = max( d_temp_max, ms_temp_max, g_temp_max, sg_temp_max )
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red","violet","blue"])
#cmap = cm.get_cmap('hsv', 7)
norm = plt.Normalize(xmin, xmax)
sd = dwarfs['radius']
im = ax.scatter(dwarfs['temp'], dwarfs['lum'], c=dwarfs['temp'], s=sd, cmap=cmap, vmin=xmin, vmax=xmax)
sms = ms['radius']
im = ax.scatter(ms['temp'], ms['lum'], c=ms['temp'], s=sms, cmap=cmap)
sg = giants['radius']
im = ax.scatter(giants['temp'], giants['lum'], c=giants['temp'],s=sg, cmap=cmap)
ssg = supergiants['radius']
im = ax.scatter(supergiants['temp'], supergiants['lum'], c=supergiants['temp'],s=ssg, cmap=cmap)
ax.set_xlabel('Temperatura (K)')
ax.set_ylabel('Luminosidad (L$_{sol}$)')
ax.set_title('Diagrama Hertzsprung-Russell')
ax.set_xlim(xmax, xmin-300)
#ax.set_xticks([12000, 10000, 8000, 6000, 3500])
ax.set_yscale("log")
fig.colorbar(im, ax=ax)
<matplotlib.colorbar.Colorbar at 0x7f2416ffd4e0>
all_stars = pd.concat([dwarfs, ms, giants, supergiants], ignore_index=True)
fig, ax = plt.subplots(figsize=[10,6])
# -- valor máximo y mínimo de temperatura para poder definir valores del eje x
xmin = min( d_temp_min, ms_temp_min, g_temp_min, sg_temp_min )
xmax = max( d_temp_max, ms_temp_max, g_temp_max, sg_temp_max )
# -- crear colores para las estrellas, de rojo (fria) a azul (caliente)
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red","yellow","blue"])
# -- definir el tamaño del punto de acuerdo al radio
sd = all_stars['radius']
# -- x: temperatura, y: luminosidad, color: temperatura
# -- estoy haciendo el punto el doble del tamaño, solo porque me parece se ve mejor
# -- cmap: colores que defini un par de lineas arruba
im = ax.scatter(all_stars['temp'], all_stars['lum'] , c=all_stars['temp'],
s=sd*2,cmap=cmap)
# -- definir nombre de ejes y título del gráfico
ax.set_xlabel('Temperatura (K)')
ax.set_ylabel('Luminosidad (L$_{sol}$) en escala logarítmica')
ax.set_title('Diagrama Hertzsprung-Russell', fontsize = 15)
# -- definir limites del eje x, para que incremente de derecha a izquierda
ax.set_xlim(xmax+300, xmin-300)
# -- poner eje y en escala logarítimica para que se entienda mejor el gráfico
ax.set_yscale("log")
# -- definir el label de cada grupo de estrellas, usando cantidad máximas y mínimas y ajustando
ax.text((d_temp_min+d_temp_max)/2, 2*(d_lum_max+d_lum_min)/2, 'Enanas Blancas',fontweight='bold')
ax.text(1.3*(ms_temp_min+ms_temp_max)/2, 5*(ms_lum_max+ms_lum_min)/2, 'Secuencia principal',fontweight='bold')
ax.text(g_temp_max+700, (g_lum_max+g_lum_min)/2, 'Gigantes',fontweight='bold')
ax.text((sg_temp_min+sg_temp_max)/2, sg_lum_min*0.3, 'Supergigantes',fontweight='bold')
fig.colorbar(im, ax=ax)
<matplotlib.colorbar.Colorbar at 0x7f2416df84a8>
Después de tener un diseño de base para el ejercicio No. 1, en este ejercicio se pide generar una animación, en la cual se reproduzca el mismo gráfico de antes pero las estrellas vayan apareciendo progresivamente.
text_d = np.concatenate(([None]*5,['Enanas Blancas']*101))
text_ms = np.concatenate(([None]*95,['Secuencia Principal']*11))
text_g = np.concatenate(([None]*100,['Gigantes']*6))
text_sg = np.concatenate(([None]*105,['Supergigantes']*1))
len(text_ms)
106
fig, ax = plt.subplots(figsize=[10,6])
# -- valor máximo y mínimo de temperatura para poder definir valores del eje x
xmin = min( d_temp_min, ms_temp_min, g_temp_min, sg_temp_min )
xmax = max( d_temp_max, ms_temp_max, g_temp_max, sg_temp_max )
# -- crear colores para las estrellas, de rojo (fria) a azul (caliente)
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red","yellow","blue"])
# -- definir el tamaño del punto de acuerdo al radio
sd = all_stars['radius']
# -- x: temperatura, y: luminosidad, color: temperatura
# -- estoy haciendo el punto el doble del tamaño y el borde negro, solo porque me parece se ve mejor
# -- cmap: colores que defini un par de lineas arruba
im = ax.scatter(all_stars['temp'], all_stars['lum'], c=all_stars['temp'],cmap=cmap)
# -- definir nombre de ejes y título del gráfico
ax.set_xlabel('Temperatura (K)')
ax.set_ylabel('Luminosidad (L$_{sol}$) en escala logarítmica')
ax.set_title('Diagrama Hertzsprung-Russell', fontsize = 15)
# -- definir limites del eje x, para que incremente de derecha a izquierda
ax.set_xlim(xmax+300, xmin-300)
# -- poner eje y en escala logarítimica para que se entienda mejor el gráfico
ax.set_yscale("log")
# -- definir el label de cada grupo de estrellas, usando cantidad máximas y mínimas y ajustando
an1 = ax.annotate(' ', fontweight='bold', xy = ((d_temp_min+d_temp_max)/2, 2*(d_lum_max+d_lum_min)/2))
an2 = ax.annotate(' ', fontweight='bold', xy = (1.3*(ms_temp_min+ms_temp_max)/2, 5*(ms_lum_max+ms_lum_min)/2))
an3 = ax.annotate(' ', fontweight='bold', xy = (g_temp_max+700, (g_lum_max+g_lum_min)/2))
an4 = ax.annotate(' ', fontweight='bold', xy = ((sg_temp_min+sg_temp_max)/2, sg_lum_min*0.3))
fig.colorbar(im, ax=ax)
datas = list(zip(all_stars['temp'], all_stars['lum']))
x,y = [],[]
r = []
def animate(i):
x.append(all_stars['temp'][i])
y.append(all_stars['lum'][i])
im.set_offsets(np.c_[x,y])
im.set_array(np.array(x))
r.append(all_stars['radius'][i])
im.set_sizes(np.array(r))
an1.set_text((text_d[i]))
an2.set_text((text_ms[i]))
an3.set_text((text_g[i]))
an4.set_text((text_sg[i]))
# an1.set_positon[posicion[107]]
return im
# -- ES MEJOR VER EL GIF QUE SE GUARDA
ani = FuncAnimation (fig, animate, frames=106, interval=300)
#ani
#ani.save('sine_wave.gif')