Как построить галактические координаты, используя matplotlib и astropy в python?

Я хочу сделать проекцию миллисекундных пульсаров на галактическую плоскость, очень похожую на эту от Сала и др. 2004 :Из Жозепа Сала, "ТЭО навигационной системы космического корабля..."

Я пробовал несколько способов, и ничего не добился. Это мой текущий код вместе с тем, что он производит:

import math as m
import numpy as np
import csv
import matplotlib.pyplot as plt
import pandas as pd
import astropy.coordinates as coord
import astropy.units as u
from astropy.io import ascii
from astropy.coordinates import SkyCoord

data = pd.read_csv('galacticwperiod.csv')

xarr = np.array(data.iloc[:,0])
yarr = np.array(data.iloc[:,1])
eq = SkyCoord(xarr[:], yarr[:], unit=u.deg)
gal = eq.galactic

#print(xarr)
#xarr = np.array(df.iloc[:,0])
#yarr = np.array(df.iloc[:,1])
#zarr = np.array(df.iloc[:,2])

#ra = coord.Angle(xarr[:], unit=u.hour)
#ra.degree
#ra = ra.wrap_at(180*u.degree)
#dec = coord.Angle(yarr[:], unit=u.deg)
#print(ra)

plt.figure(figsize=(6,5))
fig = plt.figure()
ax = fig.add_subplot(111, projection="aitoff")
plt.plot(gal.l.wrap_at(180*u.deg), gal.b.wrap_at(180*u.deg), linestyle='None')
ax.scatter(gal.l, gal.b, linestyle='None')


#ax.set_facecolor('xkcd:battleship grey')
#fig.patch.set_facecolor('white')
#ax.tick_params(axis='both', which='major', labelsize=10)
#ax.grid(color='b', linestyle='solid')
fig.show()
#plt.savefig('millisecondcoloraitoff.png', dpi=600)

Вот несколько строк входного файла galacticwperiod.csv:

Gl,Gb
111.383,-54.849
305.898,-44.888
305.913,-44.877

Это изображение, которое он создает:Мой сюжет

Я почти уверен, что это неправильно, потому что они не распределены по галактической плоскости, как должно быть. Данные, которые я использую, взяты из каталога ATNF Pulsar .

Вот сайты, которые я уже просмотрел, для справки:

https://stackoverflow.com/questions/33105898/astropy-matplotlib-and-plot-galactic-coordinates https://astropy4scipy2014.readthedocs.io/_static/notebooks/06_Celestial_Coordinates_solutions.html

Любая помощь в этом будет принята с благодарностью.

Ответы (3)

Этот код считывает координаты как экваториальные (ra, dec) и преобразует их в галактические (l, b):

eq = SkyCoord(xarr[:], yarr[:], unit=u.deg)
gal = eq.galactic

Содержимое 'galacticwperiod.csv' уже находится в галактических координатах и ​​не должно преобразовываться. Что-то вроде этого может дать лучшие результаты:

gal = SkyCoord(xarr[:], yarr[:], frame='galactic', unit=u.deg)

Другая проблема заключается в том, что географические проекции pyplot, кажется, ожидают углов в радианах. Этот код:

plt.subplot(111, projection='aitoff')
plt.grid(True)
plt.scatter(gal.l.wrap_at('180d').radian, gal.b.radian)

производит этот сюжет:

Удачный сюжет в проекции Айтоффа

Глядя на график, который у вас есть, я замечаю, что есть концентрация точек на «полюсах». Концентрация должна быть вдоль экватора и особенно ближе к центру галактики.

Я думаю, что у вас перепутаны оси, поэтому точки вдоль галактического экватора рисуются вдоль вертикального «начального меридиана».

from astropy.io import fits    
from astropy import wcs    
import matplotlib.pyplot as plt

x = fits.open('f160w_noopt_drz.fits')['SCI']
y = wcs.WCS(x.header)

plt.subplots(figsize=(8, 8), subplot_kw={'projection':y})
plt.imshow(x.data, cmap='viridis', origin='lower', vmin=0, vmax=10)
plt.show()
Можете ли вы объяснить, что OP сделал неправильно, и что делает ваш код, чтобы исправить это, пожалуйста.
Меня немного смущает этот код — мои данные не в файле .fits. Кроме того, я могу сделать свой график цветным и еще много чего, это просто расположение звезд на моем графике, которое я не знаю, как исправить. Есть ли способ конвертировать из csv в fits?
Да, но это может быть не так просто.