Investigue sobre el diagrama de Hertzprung-Russell, una herramienta muy potente en astronomia, y describa un poco al respecto para darle contexto al resto de la tarea.
El objetivo es generar un diagrama HR lo más parecido al de esta referencia. No lucirá idéntico por que no se usarán exactamente los mismos datos,y las unidades pueden ser ligeramente distinta. La idea sí es dejar su figura lo más parecida a la de referencia en el estilo: colores, escalas en los ejes,tamaño de los marcadores, leyendas, textos en el gráfico, etc.
Los datos para crear la figura están en la carpeta Data. Cada tabla contiene las informaciones sobre un tipo de estrellas según indican los nombres de archivo. La información viene en 3 columnas: luminosidad en luminosidades solares, Temperatura en Kelvin y Radio de la estrella en unidades arbitrarias La idea es que cada estrella en el gráfico tenga un color representativo de su temperatura (que estrellas frías son rojas y estrellas calientes son azules) y que el tamaño del símbolo sea representativo del tamaño de cada estrella para diferenciar entre enanas, gigantes y estrellas de secuencia principal.
Busque que su código sea semi automático; es indispensable leer los datos desde el propio programa, no copiarlos a mano, y hallar una forma de obtener los tamaños y colores sin declararlos uno a uno.
De forma abreviada se representa con las letras H-R, corresponde a un grafico que representa la relacion entre la luminosidad de una estrella con su temperatura, de tal manera que las estrellas pasan por un secuencia en la cual se puede leer a partir de el color y el tama;o el tipo de estrella que es.
Fue realizado en 1905 por el astrónomo Ejnar Hertzsprung y, de manera independiente, en 1913 por Henry Norris Russell. El diagrama de Hertzsprung mostraba la luminosidad de las estrellas en función de su color, mientras que el diagrama inicial de Russell mostraba la luminosidad en función del tipo espectral. Ambos diagramas son equivalentes.
Lo primero que se realiza es extraer los datos de cad uno de los archivos,para esto uso la funcion "np.loadtxt()" y "pd.read.csv()". de tal manera que los guardo en variables que denomine "g,s,d,m". para las que extraje con Pandas debi convertirlo en un array debido a que me estaba generando problemas.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.ticker as mtick
print()
print("Datos Estrellas Gigantes")
print()
g=np.loadtxt('giants.txt',skiprows=1)
print (g)
print()
print("Datos Estrellas Supergigantes")
print()
s=np.loadtxt('supergiants.txt',skiprows=1)
print (s)
print()
print("Datos Estrellas Enanas")
print()
e= pd.read_csv('dwarfs.csv')
d=np.asarray(e)
print(d)
print()
print("Datos Estrellas ms")
print()
n= pd.read_csv('ms.csv')
m=np.asarray(n)
print(m)
Datos Estrellas Gigantes [[ 304.22857275 3654.60109946 145.48347412] [ 58.88436554 3808.60987506 66.6429384 ] [ 9.24698174 3991.75169193 27.60343 ] [ 58.5059452 4164.8181798 50.83296774] [ 32.03317601 4425.77388308 33.29093096]] Datos Estrellas Supergigantes [[3.59749335e+05 3.80104259e+03 2.78055832e+02] [4.16869383e+05 4.39896235e+03 1.90278395e+02] [1.00000000e+06 5.46516339e+03 1.40809113e+02] [9.20449572e+05 7.83739514e+03 4.61875564e+01] [7.79830111e+05 1.02007016e+04 1.96042436e+01]] Datos Estrellas Enanas [[1.08842874e-04 5.05064470e+03 7.09693012e+00] [1.27526371e-04 5.96754345e+03 4.58399582e+00] [2.30356250e-04 6.67416152e+03 4.15107752e+00] [2.68658138e-04 7.21676297e+03 3.49175414e+00] [4.72498028e-04 7.79518440e+03 3.47273628e+00] [6.13196970e-04 8.40269528e+03 3.07733757e+00]] Datos Estrellas ms [[7.75532496e-04 3.57700393e+03 8.14702540e-01] [2.63754574e-03 3.69116854e+03 1.20977803e+00] [6.82338694e-03 3.79350649e+03 1.63002710e+00] [1.97333128e-02 3.86247142e+03 2.36157359e+00] [4.04017335e-02 3.96353011e+03 2.91092379e+00] [4.46272371e-02 4.07200450e+03 2.79339643e+00] [9.95405417e-02 4.58071996e+03 2.70468127e+00] [1.15664477e-01 4.34634874e+03 3.36220052e+00] [1.29897263e-01 4.69522628e+03 2.79375128e+00] [1.43086941e-01 4.47193794e+03 3.36101164e+00] [1.49416996e-01 4.86608438e+03 2.65422914e+00] [2.30356250e-01 4.78148487e+03 3.32651100e+00] [2.31632770e-01 5.02066538e+03 2.87974140e+00] [4.44631267e-01 4.94340587e+03 3.91596241e+00] [4.60044666e-01 5.37279414e+03 3.09198031e+00] [4.83503921e-01 5.08935384e+03 3.71098656e+00] [5.76500914e-01 5.15719846e+03 3.82644775e+00] [7.16473282e-01 5.40743654e+03 3.62095417e+00] [1.52335106e+00 5.27765901e+03 5.26639391e+00] [2.67423766e+00 5.32017564e+03 6.43901459e+00] [2.83139200e+00 5.21815903e+03 6.98176759e+00] [4.23058086e-01 5.50109296e+03 2.78567450e+00] [1.33413568e+00 5.58126343e+03 4.22279264e+00] [1.37025060e+00 5.65000606e+03 4.11424907e+00] [5.91017037e+00 5.70276417e+03 7.17961379e+00] [4.18022829e+00 5.74934879e+03 6.10016176e+00] [7.82708410e-01 5.79307969e+03 3.05090589e+00] [4.46272371e+00 5.83379763e+03 5.99381373e+00] [2.45470892e+00 5.87513423e+03 4.62023366e+00] [2.03235701e+00 5.91710441e+03 4.19362528e+00] [1.33536503e+01 5.95972356e+03 8.71523244e+00] [4.18022829e+00 5.99508757e+03 5.38035247e+00] [1.69824365e+00 6.03491384e+03 3.67878238e+00] [5.85598560e+00 6.07124725e+03 5.92820974e+00] [5.12861384e+00 6.09983368e+03 5.54323564e+00] [5.27229861e+00 6.13286076e+03 5.51477764e+00] [6.87384920e+00 6.17047967e+03 6.02061066e+00] [1.85523958e+00 6.20433862e+03 3.50744479e+00] [9.74540742e+00 6.23860049e+03 6.69847276e+00] [1.36898913e+01 6.26891612e+03 7.56310177e+00] [6.99519781e+00 6.29955126e+03 5.69781676e+00] [1.11378150e+00 6.33496093e+03 2.68661539e+00] [3.71535229e+00 6.36629886e+03 4.28604034e+00] [4.83949449e+00 6.39797346e+03 4.69364260e+00] [3.12751931e+00 6.42999049e+03 3.88299051e+00] [4.08131392e+00 6.46235579e+03 4.25465869e+00] [1.88451674e+00 6.49977888e+03 3.06973986e+00] [6.33286164e+00 6.53291089e+03 4.90949835e+00] [3.95548735e+00 6.56641052e+03 4.00509875e+00] [3.76703799e+01 6.60028425e+03 9.71470018e+00] [2.92684686e+00 6.63946366e+03 3.43461708e+00] [1.72663285e+02 6.67416152e+03 1.72745675e+01] [4.56246977e+00 6.71935513e+03 3.95744179e+00] [2.82878539e+00 6.76521771e+03 3.20266850e+00] [4.24228655e+00 6.81176500e+03 3.68959206e+00] [1.48730487e+01 6.85901324e+03 5.96887381e+00] [2.49574379e+01 6.89625720e+03 7.22365457e+00] [2.25943577e+01 6.95023216e+03 6.78140037e+00] [5.45506588e+00 7.01622813e+03 3.73358649e+00] [1.12927574e+01 7.08360318e+03 4.85371920e+00] [2.03985830e+02 7.15240329e+03 1.50038025e+01] [9.31536765e+00 7.23453550e+03 4.21857102e+00] [1.17381593e+01 7.31875322e+03 4.46936692e+00] [1.05293121e+01 7.40514120e+03 4.13121016e+00] [1.72028341e+01 7.50020988e+03 4.83879330e+00] [9.21297728e+00 7.59798943e+03 3.62561149e+00] [2.45470892e+01 7.71907833e+03 5.11706552e+00] [2.58226019e+00 7.84447909e+03 1.98072869e+00] [1.81635193e+01 7.96709493e+03 4.12569714e+00] [2.51883663e+01 8.08641360e+03 4.49706814e+00] [6.77953645e+01 8.20973418e+03 6.38572239e+00] [3.62743801e+00 8.33727256e+03 1.89010235e+00] [5.31618395e+01 8.47766347e+03 5.26173294e+00] [3.28095293e+01 8.62337861e+03 4.12178143e+00] [2.00262669e+01 8.76567710e+03 3.22107558e+00] [7.05992358e+01 8.91327378e+03 5.07137331e+00] [2.27824277e+01 9.04701626e+03 3.08490084e+00] [8.43334758e+00 9.19534380e+03 1.97430119e+00] [2.13402744e+01 9.35963345e+03 2.71406846e+00] [7.96526080e+01 9.51969718e+03 4.36845553e+00] [9.46237161e+01 9.67468763e+03 4.45868166e+00] [7.95792790e+01 9.84711237e+03 3.94557805e+00] [3.07043565e+02 1.00143434e+04 6.43768744e+00] [5.25775082e+01 1.02007016e+04 3.00709533e+00] [2.17570495e+01 1.03949750e+04 1.99658117e+00] [4.63020266e+01 1.06254066e+04 2.52883587e+00] [1.77827941e+02 1.08968775e+04 4.01616095e+00] [1.11480780e+02 1.12313232e+04 3.04301820e+00] [1.40345987e+02 1.17091301e+04 2.94458045e+00] [3.03389118e+02 1.30107404e+04 2.92153632e+00]]
Ahora una vez se hayan extraido los datos lo que hago es extraer cada una de las columnas de cada uno de los archivos con el fin de obtener las luminosidades,las temperaturas y los radios. Ya con estos datos separados puedo realizar las graficas de dispersion.
print("g lum")
glum=g[:,0]
print(glum)
print()
print("g tem")
gtem=g[:,1]
print(gtem)
print()
print("g rad")
grad=g[:,2]
print(grad)
print()
print("d lum")
dlum=d[:,0]
print(dlum)
print()
print("g tem")
dtem=d[:,1]
print(dtem)
print()
print("g rad")
drad=d[:,2]
print(drad)
print()
print("m lum")
mlum=m[:,0]
print(mlum)
print()
print("m tem")
mtem=m[:,1]
print(mtem)
print()
print("m rad")
mrad=m[:,2]
print(mrad)
print()
print("s lum")
slum=s[:,0]
print(slum)
print()
print("s tem")
stem=s[:,1]
print(stem)
print()
print("s rad")
srad=s[:,2]
print(srad)
print()
g lum [304.22857275 58.88436554 9.24698174 58.5059452 32.03317601] g tem [3654.60109946 3808.60987506 3991.75169193 4164.8181798 4425.77388308] g rad [145.48347412 66.6429384 27.60343 50.83296774 33.29093096] d lum [0.00010884 0.00012753 0.00023036 0.00026866 0.0004725 0.0006132 ] g tem [5050.64469616 5967.54345019 6674.16152397 7216.76297425 7795.184395 8402.69528332] g rad [7.09693012 4.58399582 4.15107752 3.49175414 3.47273628 3.07733757] m lum [7.75532496e-04 2.63754574e-03 6.82338694e-03 1.97333128e-02 4.04017335e-02 4.46272371e-02 9.95405417e-02 1.15664477e-01 1.29897263e-01 1.43086941e-01 1.49416996e-01 2.30356250e-01 2.31632770e-01 4.44631267e-01 4.60044666e-01 4.83503921e-01 5.76500914e-01 7.16473282e-01 1.52335106e+00 2.67423766e+00 2.83139200e+00 4.23058086e-01 1.33413568e+00 1.37025060e+00 5.91017037e+00 4.18022829e+00 7.82708410e-01 4.46272371e+00 2.45470892e+00 2.03235701e+00 1.33536503e+01 4.18022829e+00 1.69824365e+00 5.85598560e+00 5.12861384e+00 5.27229861e+00 6.87384920e+00 1.85523958e+00 9.74540742e+00 1.36898913e+01 6.99519781e+00 1.11378150e+00 3.71535229e+00 4.83949449e+00 3.12751931e+00 4.08131392e+00 1.88451674e+00 6.33286164e+00 3.95548735e+00 3.76703799e+01 2.92684686e+00 1.72663285e+02 4.56246977e+00 2.82878539e+00 4.24228655e+00 1.48730487e+01 2.49574379e+01 2.25943577e+01 5.45506588e+00 1.12927574e+01 2.03985830e+02 9.31536765e+00 1.17381593e+01 1.05293121e+01 1.72028341e+01 9.21297728e+00 2.45470892e+01 2.58226019e+00 1.81635193e+01 2.51883663e+01 6.77953645e+01 3.62743801e+00 5.31618395e+01 3.28095293e+01 2.00262669e+01 7.05992358e+01 2.27824277e+01 8.43334758e+00 2.13402744e+01 7.96526080e+01 9.46237161e+01 7.95792790e+01 3.07043565e+02 5.25775082e+01 2.17570495e+01 4.63020266e+01 1.77827941e+02 1.11480780e+02 1.40345987e+02 3.03389118e+02] m tem [ 3577.00392563 3691.16854287 3793.50649351 3862.47142346 3963.53010938 4072.00449704 4580.71996244 4346.34873613 4695.22627739 4471.93793966 4866.08438416 4781.48486606 5020.66537703 4943.40586987 5372.79413651 5089.35383735 5157.19846219 5407.43653553 5277.65900888 5320.17564147 5218.15903424 5501.09296334 5581.26343355 5650.00605951 5702.764173 5749.34879187 5793.07969334 5833.79762635 5875.1342336 5917.10441247 5959.72355661 5995.08756731 6034.9138445 6071.24725488 6099.83367725 6132.86076347 6170.47967033 6204.33861777 6238.60048962 6268.91611749 6299.55125861 6334.96093373 6366.29885587 6397.97346435 6429.99048824 6462.35579105 6499.77887832 6532.91088688 6566.41052345 6600.28425298 6639.46366146 6674.16152397 6719.35513362 6765.21771373 6811.7649993 6859.01323665 6896.25719571 6950.23215973 7016.22813129 7083.60318038 7152.40328821 7234.53549834 7318.75322096 7405.14119932 7500.2098807 7597.98943338 7719.07832566 7844.47908514 7967.09493383 8086.4136009 8209.73417911 8337.27255903 8477.66347192 8623.37860626 8765.67709838 8913.27378033 9047.01625769 9195.34379848 9359.63345346 9519.6971821 9674.68762537 9847.11236819 10014.34336093 10200.70156073 10394.9750239 10625.40663371 10896.87754453 11231.32316184 11709.13011562 13010.74035852] m rad [ 0.81470254 1.20977803 1.6300271 2.36157359 2.91092379 2.79339643 2.70468127 3.36220052 2.79375128 3.36101164 2.65422914 3.326511 2.8797414 3.91596241 3.09198031 3.71098656 3.82644775 3.62095417 5.26639391 6.43901459 6.98176759 2.7856745 4.22279264 4.11424907 7.17961379 6.10016176 3.05090589 5.99381373 4.62023366 4.19362528 8.71523244 5.38035247 3.67878238 5.92820974 5.54323564 5.51477764 6.02061066 3.50744479 6.69847276 7.56310177 5.69781676 2.68661539 4.28604034 4.6936426 3.88299051 4.25465869 3.06973986 4.90949835 4.00509875 9.71470018 3.43461708 17.27456746 3.95744179 3.2026685 3.68959206 5.96887381 7.22365457 6.78140037 3.73358649 4.8537192 15.00380248 4.21857102 4.46936692 4.13121016 4.8387933 3.62561149 5.11706552 1.98072869 4.12569714 4.49706814 6.38572239 1.89010235 5.26173294 4.12178143 3.22107558 5.07137331 3.08490084 1.97430119 2.71406846 4.36845553 4.45868166 3.94557805 6.43768744 3.00709533 1.99658117 2.52883587 4.01616095 3.0430182 2.94458045 2.92153632] s lum [ 359749.33515574 416869.38347034 1000000. 920449.57175318 779830.11052326] s tem [ 3801.04258654 4398.96235369 5465.16339162 7837.395137 10200.70156073] s rad [278.05583213 190.27839482 140.80911319 46.18755636 19.60424358]
Finalmente uso la orden plt.scatter para graficar cada uno de los datos, el primer elemento que agrego es lo que quiero que vaya en x, en este caso es la luminosidad en el segundo ubico la temepratura de la estrella , posteriormente ubico la orden que me va a permitir asignar el punto de la grafica de acuerdo al tama;o de cada estrella.
plt.title("Diagrama de Hertzprung-Russell")
plt.scatter(gtem, glum, s=0.005*(grad*3)**2,color= 'red',edgecolors='black',marker="o",alpha=0.4)
plt.scatter(dtem, dlum, s=0.2*(drad*3)**2,color = 'white',edgecolors='black',marker="o")
plt.scatter(mtem, mlum, s=0.2*(mrad*3)**2,cmap='cm.spectral_r' ,edgecolors='black',marker="o",alpha=0.3)
plt.scatter(stem, slum, s=0.0008*(srad*3)**2,color = 'orange',edgecolors='black',marker="o")
plt.legend(("Giant","White dwarfs","Main sequence","Super giant"),loc="lower left")
ax=plt.gca()
plt.xlim(11000,2500)
plt.ylim(-10,10000)
ax.set_yscale('symlog')
plt.xlabel('Temperatura en K')
plt.ylabel('Luminosidad en Lsun')
plt.show()
Para la animacion hago uso de el modulo animation perteneciente a matplotlib y se genera una funcion que se va a encargar de actualizar los puntos sobre el plano de tal manera que se genera una especie de loop. En la parte intermedia hago uso de nuevas variables con el fin de que sean usadas en el plt.scatter y finalmente en las ultimas lineas del codigo uso la libreria animation.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def actualizar(i,fig,scat):
scat.set_offsets(([3000,i],[5000,i],[10000,i]))
print("Frames: %d" %i)
return scat,
fig=plt.figure()
x=glum
y=gtem
z=grad
xx=dlum
yy=dtem
zz=drad
a=mlum
b=mtem
d=mrad
aa=slum
bb=stem
dd=srad
ax=fig.add_subplot(111)
ax.grid(True,linestyle='-',color='0.75')
ax.set_xlim([14000,1000])
ax.set_ylim([-100,600])
scat=plt.scatter(x,y,c=x)
#scat=plt.scatter(xx,yy,c=0.005*(zz*3)**2,p=xx)
#scat=plt.scatter(a,b,c=0.005*(d*3)**2,p=a)
#scat=plt.scatter(aa,bb,c=0.005*(dd*3)**2,p=aa)
scat.set_alpha(0.1)
anim=animation.FuncAnimation(fig,actualizar,fargs=(fig,scat),frames=100,interval=100)
plt.show()