Zeichnen astronomischer Daten mit Python

Ich habe versucht, ein Diagramm zu erstellen, das die Entfernungen zwischen den Sternen und der Erde zeigt, aber ich konnte das gewünschte Diagramm nicht erhalten, wie unten gezeigt (zum Vergrößern klicken): Geben Sie hier die Bildbeschreibung einMein Diagramm:Geben Sie hier die Bildbeschreibung ein

Wie @uhoh vorgeschlagen hat, habe ich ein Diagramm über das andere gelegt. Ich entschuldige mich für die Veröffentlichung dieser verwirrenden GrafikGeben Sie hier die Bildbeschreibung ein

Das kombinierte Diagramm zeigt an, dass sich die Positionen der Kurven in meinem Diagramm vollständig von denen im erwarteten Diagramm unterscheiden.

Ich habe diese Anleitung befolgt , um die Positionsfunktionen der Sterne zu berechnen.

Meine Frage: Habe ich irgendwelche Fehler gemacht, die zu den Anomalien geführt haben?

Vielen Dank im Voraus.

Anmerkungen zum Kodex:

  • Name - Name des Sterns

  • RA - Rektaszension in Grad, ICRS-Koord. (J2000)

  • Dec - Deklination in Grad, ICRS-Koord. (J2000)

  • pm_mRA - Eigenbewegung bei Rektaszension, in Millibogensekunden pro Jahr

  • pm_mdec - Eigenbewegung in Deklination, in Millibogensekunden pro Jahr

  • vr - Radialgeschwindigkeit in Kilometern pro Sekunde, ein positiver Wert bedeutet, dass sich der Stern von uns entfernt

  • mparallax - Parallaxe des Sterns in Millibogensekunden

  • d - Entfernung zwischen dem Stern und der Erde

Mein Code:

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()
Ihre Frage ist gut geschrieben, aber ich frage mich, welche Art von Antwort Sie erwarten? Was lässt Sie glauben, dass Ihre Handlung falsch sein könnte? Probieren Sie Folgendes aus: Zeichnen Sie mit denselben Einheiten und Skalierungen wie das Original (0,0 bis 10,0 Lichtjahre ) mit dem richtigen Umrechnungsfaktor und ax.set_ylim(0.0, 10.0)speichern Sie dann eine Kopie mit transparentem Hintergrund plt.savefig('mytransparentplot', transparent=True)und überlagern Sie sie mit dem Original (in Powerpoint oder einem beliebigen Bildbearbeitungswerkzeug) und strecken Sie es und sehen Sie, ob es perfekt überlagert ist. Oder drucken Sie einige Entfernungen numerisch aus und fragen Sie, wie Sie diese überprüfen können
@uhoh Danke für deine Antwort. Ich habe meine Frage aktualisiert, die ungelöst bleibt.
Haben Sie die Einheiten Ihres Diagramms vor dem Überlagern von Parsec in Lichtjahre konvertiert?
Wenn Sie das Problem gelöst haben, können Sie eine kurze Antwort posten und auf "Akzeptieren" klicken. Keine Notwendigkeit, es zu schließen, das Problem wurde gelöst. Willkommen bei StackExchange!
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da dies eine Programmierfrage ist und keine astronomischen Informationen aufruft oder erfordert.

Antworten (1)

Ich habe vergessen, die Einheit der Entfernung von Parsec auf Lichtjahr umzustellen. Dies ist ein einfacher Einheitenumrechnungsfehler, der vermieden werden sollte.

Ultimative Grafik: Geben Sie hier die Bildbeschreibung ein

Verwendete Daten:

Name,RA(Grad),Dez(Grad),pm_RA(Mas/Jahr),pm_Dec(Mas/Jahr),Vr(km/s),Parallaxe(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

Code:

%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()

ax1 subplot gibt Ihnen einen parametrischen 3D-Plot, der die Bewegung der Sterne zeigt.

Happy End einer interessanten Geschichte! Ich denke, die Handlung und die Originaldaten sind wirklich interessant, und das Hinzufügen und Akzeptieren einer Antwort, anstatt sie zu schließen, wird es wahrscheinlich mehr Menschen ermöglichen, sie zu sehen.
Es ist auch in Ordnung, bei Ihrer eigenen Antwort auf "Akzeptieren" zu klicken
Okay, aber das System sagt mir, dass ich meine Antwort morgen annehmen kann.