Este diagrama es un gráfico relacionado con la luminosidad y temperatura de las estrellas. El gráfico tiene 5 regiones principales para cada grupo de estrellas.
La secuencia principal contiene tus promedios, las estrellas comunes para los cuales la luminocidad está relacioanda directamente con la temperatura. La estrellas de la secuencia printipal tiende a estar en el inicio o en la mitad de sus vidas, cuando la presión hacia afuera del calor de la fusión nuclear en sus núcleos aún equilibran la fuerza de la gravedad.
Las Gigantes Rojas y Supergigantes son estrellas más viejas de tamaño pequeñi y mediano que han hinchado, y son por lo tanto más luminosas aunque no estén muy calientes. Las enanas blancas han volado sus capas externas y están súper calientes, pero no muy luminosas porque son muy pequeñas. Las gigantes azules son masivas, y no tienen una vida prolongada.
El diagrama H-R es importante porque las estrellas pueden ser clasificadas por su localización en esta.
Importación de todas las librerías a usar.
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from numpy import genfromtxt
Extracción de los datos desde los archivos txt y csv. Se almacena toda la información en la variable "data"
giants = np.loadtxt("./data/giants.txt",skiprows=1)
supergiants = np.loadtxt("./data/supergiants.txt",skiprows=1)
dwarfs = genfromtxt('./data/dwarfs.csv', delimiter=',', skip_header=1)
ms = genfromtxt('./data/ms.csv', delimiter=',', skip_header=1)
join = [giants, supergiants, dwarfs, ms]
data = np.concatenate(join)
Creamos la imagen a trabajar, colores, nombres de los ejes y anotaciones.
fig, ax = plt.subplots()
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] # R -> G -> B
cm = LinearSegmentedColormap.from_list("mylist",colors, N=100)
sc = ax.scatter(data[:,1], data[:,0], s = data[:,2], cmap=cm, c=data[:,1])
ax.set_ylabel(r'$\bf{Luminosity (L_{sum})}$', loc='center')
ax.set_xlabel(r'$\bf{Temperature (K)}$', loc='center')
plt.yticks([0, 0.4*10**6, 0.8*10**6, 0.9*10**6, 10**6],[r'$\bf{0}$', r'$\bf{4x10^5}$', r'$\bf{8x10^5}$', r'$\bf{9x10^5}$', r'$\bf{10^6}$'])
plt.xticks([4000, 6000, 8000, 10000, 12000],[r'$\bf{4,000}$', r'$\bf{6,000}$', r'$\bf{8,000}$', r'$\bf{1,0000}$', r'$\bf{2x10^4}$'])
ax.invert_xaxis()
ax.annotate(r'$\bf{Giants}$', xy=(350, 80), xycoords='figure pixels')
ax.annotate(r'$\bf{Superiants}$', xy=(250, 200), xycoords='figure pixels')
ax.annotate(r'$\bf{Dwarfs}$', xy=(250, 70), xycoords='figure pixels')
ax.annotate(r'$\bf{Ms}$', xy=(180, 70), xycoords='figure pixels')
plt.show()
Aún no he podido resolverlo. He estado intentando adaptar este código hecho en clase para poder realizar lo que pide este ejercicio, pero aún no he conseguidos resultados.
import itertools
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def data_gen():
for cnt in itertools.count():
t = cnt / 10
yield t, np.sin(2*np.pi*t) * np.exp(-t/10.)
def init():
ax.set_ylim(-1.1, 1.1)
ax.set_xlim(0, 10)
del xdata[:]
del ydata[:]
line.set_data(xdata, ydata)
return line,
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)
ax.grid()
xdata, ydata = [], []
def run(data):
# update the data
t, y = data
xdata.append(t)
ydata.append(y)
xmin, xmax = ax.get_xlim()
if t >= xmax:
ax.set_xlim(xmin, 2*xmax)
ax.figure.canvas.draw()
line.set_data(xdata, ydata)
return line,
init()
ani = animation.FuncAnimation(fig, run, data_gen, interval=10, init_func=init)
ani.save('Graph.gif')
plt.show()
MovieWriter ffmpeg unavailable; using Pillow instead.