Estudiante: Angie Nicole Hernández Durán - UIS
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 miso gráfico de antes pero las estrellas vayan apareciendo progresivamente.
%matplotlib notebook
#esto es necesario para que se vea la animación
import pandas as pd
import numpy as np
import matplotlib.pyplot as py
from matplotlib import animation
import matplotlib.ticker
#importo los datos
dwarfs = pd.read_csv("data/dwarfs.csv")
main_sequence = pd.read_csv("data/ms.csv")
giants = pd.read_csv("data/giants.txt", sep = " ")
super_giants = pd.read_csv("data/supergiants.txt", sep = " ")
#los concateno
lum = np.concatenate((dwarfs['lum'], main_sequence['lum'], giants['lum'],super_giants['lum']))
temp = np.concatenate((dwarfs['temp'], main_sequence['temp'], giants['temp'],super_giants['temp']))
rad = np.concatenate((dwarfs['radius'], main_sequence['radius'], giants['radius'],super_giants['radius']))
#los pongo en dos variables que usaré eventualmente
x = temp
y = lum
#Hago el canvas, así como un subplot, y hago ahí mi scatterplot
fig = py.figure(1)
ax = fig.add_subplot(111)
scat = ax.scatter(temp , lum, s=10 * rad, c= temp, cmap = 'RdYlBu', edgecolors='k',alpha=0.9)
#invierto el eje
py.gca().invert_xaxis()
#pongo las escalas logarítmicas
ax.set_xscale('log')
ax.set_yscale('log')
#nombro los ejes
ax.set_xlabel('Temperature (K)', fontsize='large', fontweight='bold')
ax.set_ylabel('Luminosity (L)', fontsize='large', fontweight='bold')
#Nombro los grupos de estrellas
ax.text(5000, 20000, 'Red supergiants', style='italic', fontsize='large', fontweight='bold')
ax.text(11000, 100000, 'Blue giants', style='italic', fontsize='large', fontweight='bold')
ax.text(4500, 200, 'Red giants', style='italic', fontsize='large', fontweight='bold')
ax.text(8000, 1, 'Main sequence', style='italic', fontsize='large', fontweight='bold')
ax.text(8000, 0.001, 'White dwarfs', style='italic', fontsize='large', fontweight='bold')
#Para que no salga en eje X en notación científica
ax.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())
#Esta función se introduce luego para dar un marco transparente
def init():
scat.set_offsets([])
return scat,
#Debo introducir mis datos a modo de fución en FuncAnimation
def animate(i):
data = np.hstack((x[:i,np.newaxis], y[:i, np.newaxis]))
scat.set_offsets(data)
return scat,
#FuncAnimation llama repetidamente la funcion que llamé animate para hacer la animación
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(x)+1,
interval=200, blit=False, repeat=False)