Healpy Mollview散点图异常:第二个散点图出现在所有子图
Healpy projscatter 第二个散点图重复显示的原因与解决方法
问题现象
使用Healpy绘制两个带散点的mollview子图时,第一个子图的红色散点显示正常,但第二个子图的蓝色散点会同时出现在两个子图中。尝试切换子图格式(如subplot(121))无法解决,只能通过分别保存再读取图片的临时方法规避。
核心原因
Healpy的投影绘图函数(mollview、projscatter)的内部机制与Matplotlib原生子图逻辑存在冲突:
hp.mollview默认会新建独立的Axes对象,即使手动用plt.axes(ax[0])切换到指定子图,它也不会复用该Axes,而是在子图区域上叠加新的投影Axes。- 旧版参数
hold=True会强制保留所有历史绘图状态,导致后续的projscatter错误地将点绘制到所有已创建的投影Axes上。 projscatter默认依赖Healpy内部维护的投影上下文,当多个投影Axes存在时,上下文会出现混乱,导致散点被重复绘制到所有子图。
正确解决方法
直接通过mollview和projscatter的ax参数,将绘图绑定到Matplotlib创建的子图Axes上,同时弃用hold=True参数:
修正后的完整代码
import numpy as np import matplotlib.pylab as plt import healpy as hp # 生成随机角度值 # 第一个散点图 A = 2 * np.pi * (2 * np.random.rand(200) - 1) B = np.pi/2 * (2 * np.random.rand(200) - 1) # 第二个散点图 C = 2 * np.pi * (2 * np.random.rand(200) - 1) D = np.pi/2 * (2 * np.random.rand(200) - 1) fig, ax = plt.subplots(1, 2, figsize=(12.5, 10)) fig.tight_layout(pad=0.0001, h_pad=0.0001, w_pad=0.0001) # 绑定到第一个子图绘制 hp.mollview(None, cbar=None, title=None, ax=ax[0]) hp.graticule() hp.projscatter(A, B, color='red', s=30, ax=ax[0]) # 绑定到第二个子图绘制 hp.mollview(None, cbar=None, title=None, ax=ax[1]) hp.graticule() hp.projscatter(C, D, color='blue', s=30, ax=ax[1]) plt.show()
关键修改点
- 给
hp.mollview添加ax=ax[0]/ax[1]参数,强制Healpy在指定的Matplotlib子图Axes上创建投影,避免新建叠加的Axes。 - 给
hp.projscatter也添加ax参数,确保散点仅绘制到对应的子图投影上。 - 移除
hold=True参数,该参数已被Matplotlib弃用,且会导致绘图状态混乱。
内容的提问来源于stack exchange,提问作者TheMercury79
相关产品推荐
相关产品推荐

