You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改点

  1. 给hp.mollview添加ax=ax[0]/ax[1]参数,强制Healpy在指定的Matplotlib子图Axes上创建投影,避免新建叠加的Axes。
  2. 给hp.projscatter也添加ax参数,确保散点仅绘制到对应的子图投影上。
  3. 移除hold=True参数,该参数已被Matplotlib弃用,且会导致绘图状态混乱。

内容的提问来源于stack exchange,提问作者TheMercury79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:12:29