Trazado de datos astronómicos usando Python

He estado tratando de crear un gráfico que muestre las distancias entre las estrellas y la tierra, pero no pude obtener el gráfico deseado como se ve a continuación (haga clic para ampliar): ingrese la descripción de la imagen aquíMi gráfico:ingrese la descripción de la imagen aquí

Como sugirió @uhoh, superpuse un gráfico encima del otro. Me disculpo por publicar este gráfico confuso.ingrese la descripción de la imagen aquí

El gráfico combinado indica que las posiciones de las curvas en mi gráfico difieren totalmente de las del gráfico esperado.

Seguí esta guía para calcular las funciones de posición de las estrellas.

Mi pregunta: ¿Cometí algún error que resultó en anomalías?

Gracias de antemano.

Anotaciones para el Código:

  • Nombre - Nombre de la estrella

  • RA - Ascensión recta en grados, ICRS coord. (J2000)

  • Dec - Declinación en grados, ICRS coord. (J2000)

  • pm_mRA - Movimiento propio en ascensión recta, en milisegundos de arco por año

  • pm_mdec - Movimiento propio en declinación, en milisegundos de arco por año

  • vr - velocidad radial en kilómetros por segundo, un valor positivo significa que la estrella se está alejando de nosotros

  • mparallax - paralaje de la estrella en miliarcosegundos

  • d - distancia entre la estrella y la tierra

Mi código:

def parseTextFile(file_name, delimiter=",", header=0):
    """ Parse a text file to a list. The file contents are delimited and have a header. """

    with open(file_name) as f:

        # Skip the header
        for i in range(header):
            next(f)


        data = []

        # Parse file contents
        for line in f:

            # Remove the newline char
            line = line.replace('\n', '').replace('\r', '')

            # Split the line by the delimiter
            line = line.split(delimiter)

            # Strip whitespaces from individual entries in the line
            for i, entry in enumerate(line):
                line[i] = entry.strip()

            # Add the contents of the line to the data list
            data.append(line)

        return data



fig = plt.figure()
ax = fig.add_subplot() 

#time span    
time = np.arange(-60000,100000,10)  
count = 1

xdic = {}
ydic = {}
zdic = {}

#multiple lines of data
for star in parseTextFile(file_name, header=1):

    name = str(star[0])
    RA = float(star[1])
    Dec = float(star[2])
    pm_mRA = float(star[3])
    pm_mDec = float(star[4])
    vr = float(star[5])
    mparallax = float(star[6])

    pm_RA = pm_mRA * 0.001
    pm_Dec = pm_mDec * 0.001
    d = 1 / (mparallax * 0.001)

    #Transverse velocities
    vta = pm_RA * d * 4.740
    vtd = pm_Dec * d * 4.740

    #Linear velocities
    vx = vr * np.cos(Dec) * np.cos(RA) - vta * np.sin(RA) - vtd * np.sin(Dec) * np.cos(RA) 
    vy = vr * np.cos(Dec) * np.sin(RA) + vta * np.cos(RA) - vtd * np.sin(Dec) * np.sin(RA)
    vz = vr * np.sin(Dec) + vtd * np.cos(Dec)

    #unit conversion from km/s to pc/year
    vx_pcyr = vx / 977780
    vy_pcyr = vy / 977780
    vz_pcyr = vz / 977780

    #initial positions
    xi = d * np.cos(Dec) * np.cos(RA)
    yi = d * np.cos(Dec) * np.sin(RA)
    zi = d * np.sin(Dec)

    #position functions
    x = xi + vx_pcyr * time
    y = yi + vy_pcyr * time
    z = zi + vz_pcyr * time

    distance = np.sqrt(x ** 2 + y ** 2 + z ** 2)

    ax.plot(time,distance,label=name)


ax.set_xlabel('Time (Year)')
ax.set_ylabel('Distance (pc)')
ax.legend()
plt.show()
Su pregunta está bien escrita, pero me pregunto qué tipo de respuesta espera. ¿Qué te hace pensar que tu trama podría ser incorrecta? Intente esto: trace usando las mismas unidades y escala que el original (0.0 a 10.0 años luz ) usando el factor de conversión correcto y ax.set_ylim(0.0, 10.0)luego guarde una copia con un fondo transparente plt.savefig('mytransparentplot', transparent=True)y superpóngalo en el original (en PowerPoint o cualquier herramienta de manipulación de imágenes) y estirarlo y ver si se superpone perfectamente. O imprima algunas distancias numéricamente y pregunte cómo verificarlas
@uhoh Gracias por tu respuesta. He actualizado mi pregunta que sigue sin resolverse.
¿Convirtió las unidades de su gráfica de parsec a años luz antes de superponerlas?
Si resuelve el problema, está perfectamente bien publicar una respuesta breve y hacer clic en "aceptar". No es necesario cerrarlo, el problema se ha solucionado. ¡Bienvenido a Stack Exchange!
Voto para cerrar esta pregunta como fuera de tema porque se trata de una pregunta de programación y no invoca ni requiere información astronómica.

Respuestas (1)

Olvidé cambiar la unidad de distancia de parsec a año luz. Este es un simple error de conversión de unidades que debería haberse evitado.

Último gráfico: ingrese la descripción de la imagen aquí

Datos utilizados:

Nombre,RA(grados),Dec(grados),pm_RA(mas/año),pm_Dec(mas/año),Vr(km/s),paralaje(mas) Wolf 359,164.120271,+07.014658,-3842.0,
-2725.0,19.321 ,418.3
Proxima Centauri,217.42895219,-62.67948975,-3775.75,765.54,-22.40,768.13
Alpha Centauri,219.900850,-60.835619,-3608,686,-22.3,742
Barnard's star,269.45207511,+04.69339088,-798.58,10328.12,- 110.51,548.31
Gliese 445,176.92240640,+78.69116300,743.61,481.40,-111.65,186.86
Luhman 16A,150.8218675,-53.319405556,-2754.77,358.72,23.1,500.51
Sirius,101.28715533,-16.71611586,-546.01,-1223.07,-5.50,379.21
Lalande 21185,165.83414166,+35.96988004,-580.27,-4765.85,-84.69,392.64
Ross 248,355.479122,+44.177994,115.10,-1592.77,-77.715,316.7
Gliese 65,24.756054,-17.950569,3321,562,29,373.70

Código:

%matplotlib qt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
from matplotlib import pyplot as plt
from matplotlib import patches


def parseTextFile(file_name, delimiter=",", header=0):
    """ Parse a text file to a list. The file contents are delimited and have a header. """

    with open(file_name) as f:

        # Skip the header
        for i in range(header):
            next(f)


        data = []

        # Parse file contents
        for line in f:

            # Remove the newline char
            line = line.replace('\n', '').replace('\r', '')

            # Split the line by the delimiter
            line = line.split(delimiter)

            # Strip whitespaces from individual entries in the line
            for i, entry in enumerate(line):
                line[i] = entry.strip()

            # Add the contents of the line to the data list
            data.append(line)

        return data


if __name__ == "__main__":

    file_name = 'C:\\Users\\The Wings of Dream\\Desktop\\UWO-PA-Python-Course\\Lecture 5\\Homework 2\\star_data.txt'


#Program Begin:  


fig = plt.figure()
ax1 = fig.add_subplot(211, projection='3d')
ax2 = fig.add_subplot(212) 

time = np.arange(-60000,100000,10)  
count = 1

xdic = {}
ydic = {}
zdic = {}


for star in parseTextFile(file_name, header=1):

    name = str(star[0])
    RA = float(star[1])
    Dec = float(star[2])
    pm_mRA = float(star[3])
    pm_mDec = float(star[4])
    vr = float(star[5])
    mparallax = float(star[6])

    pm_RA = pm_mRA * 0.001
    pm_Dec = pm_mDec * 0.001
    d = 1 / (mparallax * 0.001)

    vta = pm_RA * d * 4.740
    vtd = pm_Dec * d * 4.740

    vx = vr * np.cos(Dec) * np.cos(RA) - vta * np.sin(RA) - vtd * np.sin(Dec) * np.cos(RA) 
    vy = vr * np.cos(Dec) * np.sin(RA) + vta * np.cos(RA) - vtd * np.sin(Dec) * np.sin(RA)
    vz = vr * np.sin(Dec) + vtd * np.cos(Dec)

    vx_pcyr = vx / 977780
    vy_pcyr = vy / 977780
    vz_pcyr = vz / 977780

    xi = d * np.cos(Dec) * np.cos(RA)
    yi = d * np.cos(Dec) * np.sin(RA)
    zi = d * np.sin(Dec)

    x = xi + vx_pcyr * time
    y = yi + vy_pcyr * time
    z = zi + vz_pcyr * time

    xdic['x'+str(count)] = x
    ydic['y'+str(count)] = y
    zdic['z'+str(count)] = z

    distance = np.sqrt(x ** 2 + y ** 2 + z ** 2) * 3.26156

    ax1.plot(xdic['x'+str(count)],ydic['y'+str(count)],zdic['z'+str(count)])
    ax2.plot(time,distance,label=name)

    count = count + 1

w_oort, h_oort = 160000, 3.2
ax2.add_patch(patches.Rectangle((-60000, 0.03), w_oort,h_oort,color='slateblue',alpha=0.2))
ax2.annotate('Oort Cloud', xy=(15000,1.6), size=12)

plt.axvline(x=0,color='gray',linestyle='--',linewidth='0.5')

#plotting constraints
ax2.set_ylim(0.0, 10.0)
ax2.set_xlim(-60000, 100000)

ax1.set_xlabel('x axis')
ax1.set_ylabel('y axis')
ax1.set_zlabel('z axis')
ax1.title.set_text('Motion of Stars in Space')
ax2.title.set_text('Distance-Time')
ax2.set_xlabel('Time (Year)')
ax2.set_ylabel('Distance (Light Year)')
ax2.legend()
plt.show()

La subparcela ax1 le dará una gráfica paramétrica en 3D que muestra el movimiento de las estrellas.

¡Final feliz para una historia interesante! Creo que la trama y los datos originales son realmente interesantes, y agregar y aceptar una respuesta en lugar de cerrarla probablemente permitirá que más personas la vean.
También está bien hacer clic en "aceptar" en su propia respuesta
Está bien, pero el sistema me dice que puedo aceptar mi respuesta mañana.