Python——astroplan库实战之观察夏季大三角(三)

目录

一、问题定义

二、定义对象

三、判断能否观察到

四、最佳观测时间

1.气团

2.视差角

3.天空图

五、完整代码及注释


一、问题定义

假设我们要使用斯巴鲁(subaru)望远镜观察“夏季大三角”(Altair,Deneb和Vega)。

二、定义对象

1.首先,定义一个Observer对象,代表subaru望远镜。

from astroplan import Observer

subaru = Observer.at_site('subaru')

2.然后,定义FixedTarget,即所要观察的目标。

①因为夏季三角形相对于天球是固定的(如果忽略相对较小的适当运动)。我们将使用from_name类方法,该方法在CDS名称解析器中查询目标的坐标

from astropy.coordinates import SkyCoord
from astroplan import FixedTarget

altair = FixedTarget.from_name('Altair')
vega = FixedTarget.from_name('Vega')

②对于无法使用from_name解析的对象,可以手动输入坐标

coordinates = SkyCoord('20h41m25.9s', '+45d16m49.3s', frame='icrs')
#20h41m25.9s是赤经,+45d16m49.3s是赤纬
deneb = FixedTarget(name='Deneb', coord=coordinates)

3.定义一个我们希望观察的时间Time(以UTC为单位)

from astropy.time import Time

time = Time('2015-06-16 12:00:00')
#夏季UTC时间,当地凌晨2点

三、判断能否观察到

1.判断我们是否能观察到目标,也就是太阳落山的时候这3个目标是否在地平线上方

subaru.target_is_up(time, altair)

subaru.target_is_up(time, vega)

subaru.target_is_up(time, deneb)

2.判断太阳是否落下

subaru.is_night(time)

3.由于升起和落下计算的进度限制,我们手动适当调整一下升起和落下的时间。

import numpy as np
import astropy.units as u

altair_rise = subaru.target_rise_time(time, altair) + 5*u.minute
altair_set = subaru.target_set_time(time, altair) - 5*u.minute

vega_rise = subaru.target_rise_time(time, vega) + 5*u.minute
vega_set = subaru.target_set_time(time, vega) - 5*u.minute

deneb_rise = subaru.target_rise_time(time, deneb) + 5*u.minute
deneb_set = subaru.target_set_time(time, deneb) - 5*u.minute

all_up_start = np.max([altair_rise, vega_rise, deneb_rise])
all_up_end = np.min([altair_set, vega_set, deneb_set])

4.让我们找到今晚的日落和日出(并确认它们确实是今晚的)

# 日落
sunset_tonight = subaru.sun_set_time(time, which='nearest')
print(sunset_tonight.iso)

# 日出
sunrise_tonight = subaru.sun_rise_time(time, which='nearest')
print(sunrise_tonight.iso)

5.检查日落和日出, 并定义观察窗口的界限

start = np.max([sunset_tonight, all_up_start])
print(start.iso)

end = np.min([sunrise_tonight, all_up_end])
print(end.iso) 

四、最佳观测时间

1.气团

①为了在观察的夜晚大致了解目标的气团,我们可以在夜间进行绘制

from astroplan.plots import plot_airmass 
import matplotlib.pyplot as plt 

plot_airmass(altair, subaru, time) 
plot_airmass(vega, subaru, time) 
plot_airmass(deneb, subaru, time)  

plt.legend(loc=1, bbox_to_anchor=(1, 1)) 
plt.show()

②获取空气质量

subaru.altaz(time, altair).secz 

subaru.altaz(time, vega).secz 

subaru.altaz(time, deneb).secz 

2.视差角

①为了在观察之夜大致了解目标的视差角,我们可以绘制另一个绘图

import matplotlib.pyplot as plt 
from astroplan.plots import plot_parallactic 

plot_parallactic(altair, subaru, time) 
plot_parallactic(vega, subaru, time) 
plot_parallactic(deneb, subaru, time) 

plt.legend(loc=2) 
plt.show()

3.天空图

①上面我们已经确定了观察目标的时间范围,现在来确定一下在时间窗的开始和结束时,目标在天空中的位置

from astroplan.plots import plot_sky
import matplotlib.pyplot as plt  

altair_style = {'color': 'r'}
deneb_style = {'color': 'g'}

plot_sky(altair, subaru, start, style_kwargs=altair_style)  
plot_sky(vega, subaru, start)  
plot_sky(deneb, subaru, start, style_kwargs=deneb_style)  

plt.legend(loc='center left', bbox_to_anchor=(1.25, 0.5))  
plt.show()  

plot_sky(altair, subaru, end, style_kwargs=altair_style)  
plot_sky(vega, subaru, end)  
plot_sky(deneb, subaru, end, style_kwargs=deneb_style)  

plt.legend(loc='center left', bbox_to_anchor=(1.25, 0.5))  
plt.show()

 开始时:

 

结束时:

注意:如果出现了此错误,不要慌。这是因为源代码只支持matplotlib<3.3版本,我删除了3.3.3版本又重新安装了3.2.1版本,就可以消除错误了。

ValueError: The number of FixedLocator locations (8), usually from a call to set_ticks, does not match the number of ticklabels (7).
 

matplotlib历史版本:https://pypi.org/project/matplotlib/#history

②我们还可以显示目标在所讨论的夜晚如何随时间移动:

time_window = start + (end - start) * np.linspace(0, 1, 10)

plot_sky(altair, subaru, time_window, style_kwargs=altair_style)  
plot_sky(vega, subaru, time_window)  
plot_sky(deneb, subaru, time_window, style_kwargs=deneb_style)  

plt.legend(loc='center left', bbox_to_anchor=(1.25, 0.5))  
plt.show()  

4.Finder Chart

通过查询以FixedTarget为中心的天空勘测图像,我们将快速以蟹状星云(Crab Nebula)M1为中心制作取景器图像

messier1 = FixedTarget.from_name("M1")
ax, hdu = plot_finder_image(messier1)
plt.tight_layout()
plt.show()

以Altair为中心,制作其周围的图像

messier1 = FixedTarget.from_name("Altair")
ax, hdu = plot_finder_image(messier1)
plt.tight_layout()
plt.show()

 

五、完整代码及注释

from astroplan import Observer
from astropy.coordinates import SkyCoord
from astroplan import FixedTarget
from astropy.time import Time
import numpy as np
import astropy.units as u
from astroplan.plots import plot_airmass
import matplotlib.pyplot as plt
from astroplan.plots import plot_parallactic
from astroplan.plots import plot_sky
from astroplan.plots import plot_finder_image
# 首先定义Observer对象,即subaru望远镜
subaru = Observer.at_site('subaru')

# 设定altair,Deneb和vega的坐标,altair和vega在CDS名称解析器中可以查询,deneb需要手动输入
altair = FixedTarget.from_name('Altair')
vega = FixedTarget.from_name('Vega')
coordinates = SkyCoord('20h41m25.9s', '+45d16m49.3s', frame='icrs')
deneb = FixedTarget(name='Deneb', coord=coordinates)

# 定义一个希望观察的时间,以UTC为单位
time = Time('2015-06-16 12:00:00')

# 检查是否能观察到我们的目标,即太阳落山时它们是否在地平线上方
a=subaru.target_is_up(time, altair)
print(a)
v=subaru.target_is_up(time, vega)
print(v)
d=subaru.target_is_up(time, deneb)
print(d)

# 判断太阳是否落山
sun=subaru.is_night(time)
print(sun)

# 手动调整升起/下落的时间
altair_rise = subaru.target_rise_time(time, altair) + 5*u.minute
altair_set = subaru.target_set_time(time, altair) - 5*u.minute

vega_rise = subaru.target_rise_time(time, vega) + 5*u.minute
vega_set = subaru.target_set_time(time, vega) - 5*u.minute

deneb_rise = subaru.target_rise_time(time, deneb) + 5*u.minute
deneb_set = subaru.target_set_time(time, deneb) - 5*u.minute

all_up_start = np.max([altair_rise, vega_rise, deneb_rise])
all_up_end = np.min([altair_set, vega_set, deneb_set])

# 查看今晚的日落和日出时间范围
sunset_tonight= subaru.sun_set_time(time, which='nearest')
print(sunset_tonight.iso)
sunrise_tonight = subaru.sun_rise_time(time, which='nearest')
print(sunrise_tonight.iso)

# 确定日落和日出时间
start = np.max([sunset_tonight, all_up_start])
print(start.iso)
end = np.min([sunrise_tonight, all_up_end])
print(end.iso)

# 绘图

# 画出3条线
plot_airmass(altair, subaru, time)
plot_airmass(vega, subaru, time)
plot_airmass(deneb, subaru, time)

# 右上角图示例
plt.legend(loc=1, bbox_to_anchor=(1, 1))
plt.show()

# 求出空气质量的值
print(subaru.altaz(time, altair).secz)
print(subaru.altaz(time, vega).secz)
print(subaru.altaz(time, deneb).secz)

# 视差角画图
plot_parallactic(altair, subaru, time)
plot_parallactic(vega, subaru, time)
plot_parallactic(deneb, subaru, time)

plt.legend(loc=2)
plt.show()

# 求出视差角的值
print(subaru.parallactic_angle(time, altair))
print(subaru.parallactic_angle(time, vega))
print(subaru.parallactic_angle(time, deneb))

# 若要考虑月亮,则需要知道月亮相关的一切信息,首先来查看一下在我们之前定义的时间内,月亮是否存在
print(subaru.moon_rise_time(time))
print(subaru.moon_set_time(time))

# 查看月亮的alt/az坐标(地平坐标系)
print(subaru.moon_altaz(time).alt)
print(subaru.moon_altaz(time).az)

# 检查月亮是否会在可见窗口内消失
visible_time = start + (end - start)*np.linspace(0, 1, 20)
print(subaru.moon_altaz(visible_time).alt)


# 天空图
# 先确定时间窗的start和end
altair_style = {'color': 'r'}
deneb_style = {'color': 'g'}

plot_sky(altair, subaru, start, style_kwargs=altair_style)
plot_sky(vega, subaru, start)
plot_sky(deneb, subaru, start, style_kwargs=deneb_style)

plt.legend(loc='center left', bbox_to_anchor=(1.25, 0.5))
plt.show()

plot_sky(altair, subaru, end, style_kwargs=altair_style)
plot_sky(vega, subaru, end)
plot_sky(deneb, subaru, end, style_kwargs=deneb_style)

plt.legend(loc='center left', bbox_to_anchor=(1.25, 0.5))
plt.show()




# 显示目标在所讨论的夜晚如何随时间移动
time_window = start + (end - start) * np.linspace(0, 1, 10)

plot_sky(altair, subaru, time_window, style_kwargs=altair_style)
plot_sky(vega, subaru, time_window)
plot_sky(deneb, subaru, time_window, style_kwargs=deneb_style)


plt.legend(loc='center left', bbox_to_anchor=(1.25, 0.5))
plt.show()

# 需要安装astroquery包
messier1 = FixedTarget.from_name("M1")
ax, hdu = plot_finder_image(messier1)
plt.show()

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值