草庐IT

python - 如何使用 Python 将 Gaia 天体测量数据绘制为 TESS 图像?

coder 2023-08-15 原文

长话短说:我想用 Python 将 Gaia 天体测量数据绘制成 TESS 图像。怎么可能?
详细版本见下文。

我有 64x64 像素 TESS盖亚 ID 为 4687500098271761792 的恒星图像。苔丝天文台指南的第 8 页说 1 像素是 ~21 弧秒。使用 Gaia Archive ,我搜索这颗星星(在顶部特征下方,单击“搜索”。)并提交查询以查看 1000 弧秒内的星星,大致是我们需要的半径。我用于搜索的名称是 Gaia DR2 4687500098271761792 ,如下图:



提交查询,我得到了一个包含 500 颗星的列表,带有 RADEC坐标。选择 CSVDownload results , 我得到了 4687500098271761792 周围的星星列表。这个结果文件也可以在 here 中找到。 .这是来自 Gaia 的输入我们想使用。

从苔丝,我们有 4687500098271761792_med.fits , 图像文件。我们使用以下方法绘制它:

from astropy.io import fits
from astropy.wcs import WCS
import matplotlib.pyplot as plt
hdul = fits.open("4687500098271761792_med.fits")[0]
wcs = WCS(hdul.header)
fig = plt.figure(figsize=(12,12))
fig.add_subplot(111, projection=wcs)
plt.imshow(hdul.data)

并得到一张漂亮的照片:



和一堆警告,其中大部分都得到了善意的解释 here (warnings in the Q, explanation in the comments) .

请注意,我们使用 WCS 确实很好。投影。为了检查,让我们绘制 hdul.data 中的数据不关心投影:
plt.imshow(hdul.data)

结果:



几乎和以前一样,但现在轴的标签只是像素数,而不是 RA and DEC ,这将是可取的。 DECRA第一个图中的值分别约为 -72° 和 16°,这很好,因为盖亚目录为我们提供了 4687500098271761792 附近的恒星,大致具有这些坐标。所以投影似乎还可以。

现在让我们尝试绘制imshow()上方的盖亚星。情节。我们阅读了 CSV我们之前下载的文件并解压缩 RADEC来自它的对象的值:
import pandas as pd
df=pd.read_csv("4687500098271761792_within_1000arcsec.csv")
ralist=df['ra'].tolist()
declist=df['dec'].tolist()

要检查的图:
plt.scatter(ralist,declist,marker='+')



形状不是预期的圆形。这可能是 future 麻烦的一个指标。

让我们试着改造这些 RADEC值为 WCS ,并以这种方式绘制它们:
for index, each in enumerate(ralist):
    ra, dec = wcs.all_world2pix([each], [declist[index]], 1)
    plt.scatter(ra, dec, marker='+', c='k')

结果是:



函数all_world2pix来自 here . 1参数只是设置原点的位置。 all_world2pix的说明说:

Here, origin is the coordinate in the upper left corner of the image. In FITS and Fortran standards, this is 1. In Numpy and C standards this is 0.



然而,我们得到的点分布的形状根本没有希望。让我们把 TESS 和 Gaia 数据放在一起:
hdul = fits.open("4687500098271761792_med.fits")[0]
wcs = WCS(hdul.header)
fig = plt.figure(figsize=(12,12))
fig.add_subplot(111, projection=wcs)
plt.imshow(hdul.data)
for index, each in enumerate(ralist):
    ra, dec = wcs.all_world2pix([each], [declist[index]], 1)
    plt.scatter(ra, dec, marker='+', c='k')

我们得到:



这与理想情况相差甚远。我希望有一个基础 imshow()上面有许多标记的图片,标记应该是 TESS 图像上星星所在的位置。我工作的 Jupyter Notebook 可用 here .

我错过了哪些步骤,或者我做错了什么?

进一步发展

response到另一个 question , keflavich建议使用 transform plotting in world coordintes 的论据.用一些示例点(下图中的弯曲十字)进行了尝试。还把盖亚数据绘制在地块上,没有处理它,它们最终集中在一个非常狭窄的空间。应用于他们transform方法,得到了一个看似与以前非常相似的结果。代码(还有 here):
import pandas as pd
df=pd.read_csv("4687500098271761792_within_1000arcsec.csv")
ralist=df['ra'].tolist()
declist=df['dec'].tolist()

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

hdul = fits.open("4687500098271761792_med.fits")[0]
wcs = WCS(hdul.header)

fig = plt.figure(figsize=(12,12))
fig.add_subplot(111, projection=wcs)
plt.imshow(hdul.data)

ax = fig.gca()
ax.scatter([16], [-72], transform=ax.get_transform('world'))
ax.scatter([16], [-72.2], transform=ax.get_transform('world'))
ax.scatter([16], [-72.4], transform=ax.get_transform('world'))
ax.scatter([16], [-72.6], transform=ax.get_transform('world'))
ax.scatter([16], [-72.8], transform=ax.get_transform('world'))
ax.scatter([16], [-73], transform=ax.get_transform('world'))


ax.scatter([15], [-72.5], transform=ax.get_transform('world'))
ax.scatter([15.4], [-72.5], transform=ax.get_transform('world'))
ax.scatter([15.8], [-72.5], transform=ax.get_transform('world'))
ax.scatter([16.2], [-72.5], transform=ax.get_transform('world'))
ax.scatter([16.6], [-72.5], transform=ax.get_transform('world'))
ax.scatter([17], [-72.5], transform=ax.get_transform('world'))

for index, each in enumerate(ralist):
    ax.scatter([each], [declist[index]], transform=ax.get_transform('world'),c='k',marker='+')

for index, each in enumerate(ralist):
    ax.scatter([each], [declist[index]],c='b',marker='+')

以及由此产生的情节:



这个弯曲的十字架是预料之中的,因为 TESS 没有与恒定的纬度和经度线对齐(即十字架的臂不必与 TESS 图像的边平行,用 imshow() 绘制)。现在让我们尝试绘制恒定的 RA 和 DEC 线(或者说恒定的纬度和经度线),以更好地理解 Gaia 数据点错位的原因。将上面的代码扩展几行:
ax.coords.grid(True, color='green', ls='solid')

overlay = ax.get_coords_overlay('icrs')
overlay.grid(color='red', ls='dotted')

结果令人鼓舞:



(见笔记本 here。)

最佳答案

首先我要说,好问题!非常详细和可复制。我仔细研究了您的问题,并尝试从您的 git 存储库开始重做练习,并从 GAIA 存档中下载目录。

编辑

以编程方式您的代码很好(请参阅下面的 旧部分 以了解略有不同的方法)。缺失点的问题是从 GAIA 存档下载 csv 文件时只能获得 500 个数据点。因此看起来好像查询中的所有点都塞进了一个奇怪的形状。但是,如果您将搜索半径限制为较小的值,您可以看到 TESS 图像内有一些点:



请与旧部分中显示的版本进行比较。代码与下面相同,只是下载的 csv 文件适用于较小的半径。因此,在导出到 csv 时,您似乎只是从 GAIA 存档下载了所有可用数据的一部分。避免这种情况的方法是像您一样进行搜索。然后,在结果页面上点击 Show query in ADQL form在底部和查询中,您以 SQL 格式更改显示:

Select Top 500


Select

在查询的开头。

旧部分(代码正常并且工作正常,但我的结论是错误的):

对于绘图,我使用了 aplpy - 在后台使用 matplotlib - 最后得到以下代码:
from astropy.io import fits
from astropy.wcs import WCS
import aplpy
import matplotlib.pyplot as plt
import pandas as pd
from astropy.coordinates import SkyCoord
import astropy.units as u
from astropy.io import fits 


fits_file = fits.open("4687500098271761792_med.fits")
central_coordinate = SkyCoord(fits_file[0].header["CRVAL1"],
                              fits_file[0].header["CRVAL2"], unit="deg")

figure = plt.figure(figsize=(10, 10))
fig = aplpy.FITSFigure("4687500098271761792_med.fits", figure=figure)
cmap = "gist_heat"
stretch = "log"

fig.show_colorscale(cmap=cmap, stretch=stretch)
fig.show_colorbar()

df = pd.read_csv("4687500098271761792_within_1000arcsec.csv")    

# the epoch found in the dataset is J2015.5
df['coord'] = SkyCoord(df["ra"], df["dec"], unit="deg", frame="icrs",
                       equinox="J2015.5")
coords = df["coord"].tolist()
coords_degrees = [[coord.ra.degree, coord.dec.value] for coord in df["coord"]]
ra_values = [coord[0] for coord in coords_degrees]
dec_values = [coord[1] for coord in coords_degrees]

width = (40*u.arcmin).to(u.degree).value
height = (40*u.arcmin).to(u.degree).value
fig.recenter(x=central_coordinate.ra.degree, y=central_coordinate.dec.degree, 
             width=width, height=height)
fig.show_markers(central_coordinate.ra.degree,central_coordinate.dec.degree, 
                 marker="o", c="white", s=15, lw=1)
fig.show_markers(ra_values, dec_values, marker="o", c="blue", s=15, lw=1)
fig.show_circles(central_coordinate.ra.degree,central_coordinate.dec.degree, 
                 radius=(1000*u.arcsec).to(u.degree).value, edgecolor="black")
fig.save("GAIA_TESS_test.png")

但是,这会导致与您类似的情节:



为了检查我对来自 GAIA 文件的坐标是否正确显示的怀疑,我从 TESS 图像的中心画了一个 1000 弧秒的圆。正如您所看到的,它与 GAIA 位置的数据点云的外侧(从图像中心看)的圆形大致对齐。我只是认为这些都是 GAIA DR2 文件中属于您搜索区域的所有点。数据云的内部甚至似乎有一个方形的边界,这可能来自方形的视野。

关于python - 如何使用 Python 将 Gaia 天体测量数据绘制为 TESS 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54116787/

有关python - 如何使用 Python 将 Gaia 天体测量数据绘制为 TESS 图像?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  5. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  6. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  7. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  9. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  10. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

随机推荐