Astropy/SkyCoord:对于大于 180 度的角度,如何让 x 轴显示完整的度数范围而不是负数?
Astropy/SkyCoord: How do I get the x-axis to show full degree range instead of negative numbers for angles > 180?
我有以下代码来绘制几对银河坐标,但希望 x 轴显示完整的度数范围,而不是大于 180 度的角度的负数。有什么建议吗?我只是忽略了 SkyCoord 参数吗?
工作示例:
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from astropy import units as u
from astropy.coordinates import SkyCoord
plt.rcParams['figure.figsize'] = [8,8] # [width, height]
df = pd.read_csv('sight_lines_coord.txt', delimiter='\s+', usecols=['l', 'b'])
stars = SkyCoord(df['l'], df['b'], frame='galactic', unit=u.deg)
plt.scatter(stars.l.wrap_at('180d'), stars.b)
plt.grid(True)
我的情节是这样的。
数据框由两列组成:经度、纬度(例如 325.0、-5.2)
我应该早点添加这个,抱歉。如果我使用 wrap_at('360d') 我会得到这个图,这不是我想要的。
180 度环绕给出了我想要的图片,我只需要我的 xtick 标签是非负的。
pyplot.xticks
就是这个功能。不带参数调用,它 returns 一个元组,(ticks, labels)
。 ticks
是所有当前 x-axis 刻度的 x 坐标,labels
是它们的标签。如果使用两个参数调用,它会设置刻度值。
有一个警告,有时您从 pyplot.xticks() 获得的 labels
是空的,直到您调用 plt.show() 之后(我不确定为什么).这意味着您应该只使用 ticks
来设置标签。
plt.figure()
x = np.arange(-30, 30, 1)
plt.plot(x, np.sin(x/10))
ticks, labels = plt.xticks()
for tick, label in zip(ticks, labels):
tick_value = tick if (tick >= 0) else tick + 360
label.set_text(str(tick_value))
plt.xticks(ticks, labels)
反转 X-axis 看起来像:
lower, upper = plt.xlim()
plt.xlim(upper, lower)
同样,不带参数调用,returns先是左边界,然后是右边界。用两个参数调用,它设置左右边界。通过翻转它们,我们可以反转轴。将其合并到上面的代码中可以得到:
旧答案:
你使用 Angle.wrap_at
(docs here) 我认为这是你问题的根源。
stars.l.wrap_at('180d')
将强制数组中的所有角度都在 -180 <= angle < 180 范围内。对于您的情况,您希望数组被包装成 0 <= angle < 360,这将由 stars.l.wrap_at('360d')
.
完成
我有以下代码来绘制几对银河坐标,但希望 x 轴显示完整的度数范围,而不是大于 180 度的角度的负数。有什么建议吗?我只是忽略了 SkyCoord 参数吗?
工作示例:
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from astropy import units as u
from astropy.coordinates import SkyCoord
plt.rcParams['figure.figsize'] = [8,8] # [width, height]
df = pd.read_csv('sight_lines_coord.txt', delimiter='\s+', usecols=['l', 'b'])
stars = SkyCoord(df['l'], df['b'], frame='galactic', unit=u.deg)
plt.scatter(stars.l.wrap_at('180d'), stars.b)
plt.grid(True)
我的情节是这样的。
数据框由两列组成:经度、纬度(例如 325.0、-5.2)
我应该早点添加这个,抱歉。如果我使用 wrap_at('360d') 我会得到这个图,这不是我想要的。
180 度环绕给出了我想要的图片,我只需要我的 xtick 标签是非负的。
pyplot.xticks
就是这个功能。不带参数调用,它 returns 一个元组,(ticks, labels)
。 ticks
是所有当前 x-axis 刻度的 x 坐标,labels
是它们的标签。如果使用两个参数调用,它会设置刻度值。
有一个警告,有时您从 pyplot.xticks() 获得的 labels
是空的,直到您调用 plt.show() 之后(我不确定为什么).这意味着您应该只使用 ticks
来设置标签。
plt.figure()
x = np.arange(-30, 30, 1)
plt.plot(x, np.sin(x/10))
ticks, labels = plt.xticks()
for tick, label in zip(ticks, labels):
tick_value = tick if (tick >= 0) else tick + 360
label.set_text(str(tick_value))
plt.xticks(ticks, labels)
反转 X-axis 看起来像:
lower, upper = plt.xlim()
plt.xlim(upper, lower)
同样,不带参数调用,returns先是左边界,然后是右边界。用两个参数调用,它设置左右边界。通过翻转它们,我们可以反转轴。将其合并到上面的代码中可以得到:
旧答案:
你使用 Angle.wrap_at
(docs here) 我认为这是你问题的根源。
stars.l.wrap_at('180d')
将强制数组中的所有角度都在 -180 <= angle < 180 范围内。对于您的情况,您希望数组被包装成 0 <= angle < 360,这将由 stars.l.wrap_at('360d')
.