Nombre: Carla Gomez
Estudiante Lic. Física
Universidad Simón Bolívar
Caracas, Venezuela
Ejercicio 1 y 2 Gráfico de Hertzsprung-Russell
El diagrama de Hertzsprung-Russell es un gráfico de estrellas que relaciona la luminosidad y las temperatura. Permitiendo clasificar las estrellas, ubicandolas en tres zonas definidas:
Con este diagrama se puede manejar gran cantidad de estrellas gráficamente.
En el siguiente ejercicio se plantea el uso de matplotlib para realizar un diagrama Hertzsprung-Russell, con data en 2 tipos de archivos .csv y .txt, y posteriormente animarla.
import io
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib import cm
from matplotlib.animation import FuncAnimation
from matplotlib import rc
from math import *
import matplotlib.animation as animation
import csv, json
rc('animation', html='jshtml')
#Lee los archivos y guarda la informacion en la variable full_data
def read_file(filename, delimiter = ','):
with open(filename) as csv_file:
data = csv.reader(csv_file, delimiter=delimiter)
isHeader = True
total = 0
for row in data:
if (not isHeader):
total = total + 1
full_data.append(row)
else:
isHeader = False
#Responde con el numero de lineas
return total
full_data = []
#Lee cada archivo
mainMark = read_file('./data/ms.csv')
dwarfMark = mainMark + read_file('./data/dwarfs.csv')
giantsMark = dwarfMark + read_file('./data/giants.txt', ' ')
supergiantsMark = giantsMark + read_file('./data/supergiants.txt', ' ')
#Titulo
plt.title('Hertzprung-Russel')
#Espacio que ocupa
fig = plt.figure(figsize=(10,10))
#Invierte el axis X
plt.gca().invert_xaxis()
#Etiquetas de las escalas
ax = plt.axes()
ax.set_ylabel('log_lum')
ax.set_xlabel('temp')
#Eje Y con escala logaritmica
ax.set_yscale('log')
index = 0
total = 0
temperature = []
luminosity = []
radius = []
#Esta funcion se ejecuta en cada cuadro de la animacion
def frame(w):
#Variables globales que la funcion necesita
global index, full_data, temperature, luminosity, radius
#Agrega una fila en cada cuadro
temperature.append(float(full_data[index][0]))
luminosity.append(float(full_data[index][1]))
radius.append(float(full_data[index][2]) * 3)
#Cada vez que llega al final de uno de los archivos, agrega una etiqueta
if index == mainMark:
ax.annotate('Main Sequence',(10000,10))
elif index == dwarfMark:
ax.annotate('Dwarves',(7000,0.001))
elif index == giantsMark:
ax.annotate('Giants',(5000,300))
elif index == supergiantsMark -1:
ax.annotate('Supergiants',(6500,99000))
index = index + 1
#Genera el grafico con la data actual
plot = ax.scatter(x=luminosity, y=temperature, c=cm.Spectral(temperature), s=radius)
return plot
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:9: 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. if __name__ == '__main__':
anim = animation.FuncAnimation(fig, frame, frames=len(full_data) - 1, blit=False, repeat=True)
#anim
plt.ylabel('log_lum')
plt.xlabel('temp')
plt.yscale('log')
plt.annotate('Main Sequence',(10000,10))
plt.annotate('Dwarves',(7000,0.001))
plt.annotate('Giants',(5000,300))
plt.annotate('Supergiants',(6500,99000))
plt.gca().invert_xaxis()
plt.scatter(x=luminosity, y=temperature, c=cm.Spectral(temperature), s=radius)
<matplotlib.collections.PathCollection at 0x7f3d8635ed68>