Matplotlib颜色条和WCS投影

3

我试图编写一个函数,以带有颜色条的形式显示天文图像(自动与x轴相同长度)。但是我遇到了问题,因为当我尝试将刻度放在顶部时,它没有任何作用...它仍然将刻度保留在颜色条的底部(还有颜色条的y轴上的刻度)。我认为这可能是与x轴的WCS坐标有关的问题,因为当我尝试不使用投影进行操作时,它可以正常工作!

import numpy as np
import matplotlib.pyplot as plt
from astropy import wcs
from matplotlib.colors import PowerNorm
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib import cm

#WCS coordinate system
w = wcs.WCS(naxis=2)
w.wcs.crpix = [23.5, 23.5]
w.wcs.cdelt = np.array([-0.0035, 0.0035])
w.wcs.crval = [266.8451, -28.151658]
w.wcs.ctype = ["RA---TAN", "DEC--TAN"]
w.wcs.set_pv([(2, 1, 45.0)])

#generate an array as image test
data = (np.arange(10000).reshape((100,100)))

#display image
fig = plt.figure()
ax = plt.gca(projection=w)
graf = ax.imshow(data, origin='lower', cmap=cm.viridis, norm=PowerNorm(1))

#colorbar
divider = make_axes_locatable(ax)
cax = divider.append_axes("top", size="5%")
cbar = fig.colorbar(graf, cax=cax, orientation='horizontal')
cax.xaxis.set_ticks_position('top')
fig.show()

谢谢!


如果我们无法运行这个大块的代码,那它就相当无用了。尝试编辑它,使其他人能够(至少在当前代码的范围内)运行它,并查看生成的图像或停止的错误信息。 - Gabriel
简而言之,请阅读[mcve]并相应地编辑您的问题。 - ImportanceOfBeingErnest
1
抱歉!我已经编辑了代码,现在可以验证了! - Mikifiori
3个回答

3
您可以使用 Matplotlib 的 axes 类 来解决此问题。
...
import matplotlib.axes as maxes
cax = divider.append_axes("top", size="5%", axes_class=maxes.Axes)
...

2
你需要使用WCSAxes的内部机制来处理WCS投影中的刻度。看起来WCSAxes通过坐标映射容器(可以在cbar.ax.coords中找到)处理色条刻度,而不是xaxis/yaxis属性(似乎很少使用)。

因此,在运行代码后,以下技巧对我有用,xticks向上移动:

c_x = cbar.ax.coords['x']
c_x.set_ticklabel_position('t')
cbar.update_normal(cax)

太好了,谢谢!但是现在我发现色条的范围(和刻度)是错误的。它应该在0到1000之间,并且如果我改变规范,它应该改变刻度...但是它没有改变! - Mikifiori
嗯,正确的刻度标签似乎存储在cax.xaxis中,也许你可以以某种方式将它们复制到WCSAxes的色条上? - Vlas Sokolov

0
为了使这样的东西运行起来,我需要一些额外的参数:
            from mpl_toolkits.axes_grid1 import make_axes_locatable
            divider = make_axes_locatable(ax)
            cax = divider.append_axes("right", size="5%", pad=0.05)
            cax.coords[0].grid(False)
            cax.coords[1].grid(False)
            cax.tick_params(direction='in')
            cax.coords[0].set_ticks(alpha=0, color='w', size=0, values=[]*u.dimensionless_unscaled)
            cax.coords[1].set_ticklabel_position('r')
            cax.coords[1].set_axislabel_position('r')

因为默认的轴上有网格,标签在左侧,并且启用了x轴标签。我不确定为什么原始帖子没有这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接