Python画球面投影图

天文学研究中,有时候需要画的并不是传统的XYZ坐标系,而是需要画一个形如这样子的球面投影图:

下面讲一下这种图怎么画

1. 首先要安装healpy包
pip install healpy
2. 然后导入包

如果之前安装过healpy,有的会提示不存在healpy.newvisufunc,更新一下healpy即可

from healpy.newvisufunc import projview, newprojplot
import numpy as np
import matplotlib.pyplot as plt 
3. 指定空间分辨率

这里指定nside参数为32,nside越大,空间分辨率越好

nside=32
npix = hp.nside2npix(nside)
4.把数据转换到healpix index

假设你的数据保存在一个dataframe中,银经和银纬的列名分别是l和b,注意纬度这里需要用90减去银纬,并且经度和纬度都需要转换为弧度制

indices = hp.ang2pix(nside,list(np.radians(90. - data.b)),list(np.radians(data.l)))
indi, counts = np.unique(indices,return_counts=True)

hpx_map = np.zeros(npix, dtype=int)
hpx_map[indi] = counts
5.对没有数据区域的处理

有时候部分空间上是没有数据的,但是healpy默认会把没有计为0,所以我们需要把0用nan替换

hpx_map = np.where(hpx_map == 0, np.nan, hpx_map)
6. 画图
projview(hpx_map,cmap='rainbow',graticule=1,graticule_labels=1,
         fontsize={'cbar_label':18,'cbar_tick_label':13},
         cb_orientation='vertical')

 cmap表示颜色的colormap,graticule=1表示显示经纬线,graticule_labels=1表示显示那些0°,30°的标识,fontsize里的表示那些经纬线和标识的字体大小,cb_orientation='vertical'表示把colorbar的线条画到右边,默认是下边

7.加label

projview图和常见的plt.plot一样,也可以通过plt.xlabel(),plt.title()加横纵坐标的名字和图片的名字,也可以通过plt.tick_params来修改colorbar的线条的长短

plt.tick_params(labelsize=18)
plt.xlabel('GL (°)',size=18)
plt.ylabel('GB (°)',size=18)
plt.title('Dwarf',size=18)

完整的代码如下:

from healpy.newvisufunc import projview, newprojplot
import numpy as np
import matplotlib.pyplot as plt 

nside=32
npix = hp.nside2npix(nside)

indices = hp.ang2pix(nside,list(np.radians(90. - dwarf.b)),list(np.radians(dwarf.l)))
indi, counts = np.unique(indices,return_counts=True)

hpx_map = np.zeros(npix, dtype=int)
hpx_map[indi] = counts
hpx_map = np.where(hpx_map == 0, np.nan, hpx_map)
        
projview(hpx_map,cmap='rainbow',graticule=1,graticule_labels=1,
         fontsize={'cbar_label':18,'cbar_tick_label':13},
         cb_orientation='vertical'))
plt.tick_params(labelsize=18)
plt.xlabel('GL (°)',size=18)
plt.ylabel('GB (°)',size=18)
plt.title('Dwarf',size=18)
8.多子图操作

有时候我们需要把多个球面投影图画到一张大图上,那么只需要在projviwe()函数中加入一个参数sub,类似于

projview(hpx_map,cmap='rainbow',graticule=1,graticule_labels=1,
         fontsize={'cbar_label':18,'cbar_tick_label':13},
         cb_orientation='vertical',sub=(1,2,1))

另一个图加入sub=(1,2,2),就可以画出一行两列的两个子图,这些数字的含义和plt.subplot()一样,一个例子如下,把矮星和巨星的空间分布画到一张大图里,也就是文章开头的图片

from healpy.newvisufunc import projview, newprojplot
import numpy as np
import matplotlib.pyplot as plt 

pri_size = 18

plt.figure(figsize=(10,4))

nside=32
npix = hp.nside2npix(nside)

indices = hp.ang2pix(nside,list(np.radians(90. - dwarf.b)),list(np.radians(dwarf.l)))
indi, counts = np.unique(indices,return_counts=True)

hpx_map = np.zeros(npix, dtype=int)
hpx_map[indi] = counts
hpx_map = np.where(hpx_map == 0, np.nan, hpx_map)
        
projview(hpx_map,cmap='rainbow',graticule=1,graticule_labels=1,
         fontsize={'cbar_label':pri_size,'cbar_tick_label':pri_size-5},
         cb_orientation='vertical',sub=(1,2,1))
plt.tick_params(labelsize=pri_size)
plt.xlabel('GL (°)',size=pri_size)
plt.ylabel('GB (°)',size=pri_size)
plt.title('Dwarf',size=pri_size)


indices = hp.ang2pix(nside,list(np.radians(90. - giant.b)),list(np.radians(giant.l)))
indi, counts = np.unique(indices,return_counts=True)

hpx_map = np.zeros(npix, dtype=int)
hpx_map[indi] = counts
hpx_map = np.where(hpx_map == 0, np.nan, hpx_map)
        
projview(hpx_map,cmap='rainbow',graticule=1,graticule_labels=1,
         fontsize={'cbar_label':pri_size,'cbar_tick_label':pri_size-5},
         cb_orientation='vertical',sub=(1,2,2))
plt.tick_params(labelsize=pri_size)
plt.xlabel('GL (°)',size=pri_size)
plt.ylabel('GB (°)',size=pri_size)
plt.title('Giant',size=pri_size)

更多关于healpy的操作可以参考healpy的官方文档,官方文档里是有教程的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/327380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab串口数据交互的使用

一、matlab将串口数据读取并储存到position中 delete(instrfindall);%注销系统之前已经打开的串口资源 clear s %清空s的数据 s serial(COM6,BaudRate,115200);%定义串口及波特率 fopen(s)%打开串口 fwrite(s,00AB,)%向串口写入读取电机位置指令 for i1:8 %共8个电机position…

IPv6隧道--GRE隧道

GRE隧道 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。 GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一…

【UE Niagara 喷射火焰系列】06 - 制作火焰喷射过程中飞舞的火星

在上一篇博客(【UE Niagara学习笔记】05 - 喷射火焰顶部的蓝色火焰)的基础上继续实现喷射火焰的火星的效果。 目录 效果 步骤 一、创建材质实例 二、添加新的发射器 2.1 设置粒子材质 2.2 设置发射器持续生成粒子 2.3 设置粒子生成数量 2.4 设…

day19【LeetCode力扣】160.相交链表

day19【LeetCode力扣】160.相交链表 1.题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链…

是时候丢掉 DDE 了

有人问我这样一个问题: “作为一名应用程序开发者,如果希望和外壳(Explorer/Shell)打交道,我可以直接忽略掉 DDE 吗?” 此问题的答案是:是的,完全没有任何问题。虽然在发明它的 16 位 Windows 协作多任务…

HubSpot电子邮件自动回复怎么设置?附注意事项!

HubSpot 提供了电子邮件自动回复的功能,使得企业能够更高效地管理和处理电子邮件通信。以下是关于 HubSpot 电子邮件自动回复的一些重要信息和步骤: 设置电子邮件自动回复的步骤: 登录HubSpot账户: 打开 HubSpot 平台并登录你的账…

数据管理系统-week2-对象数据模型

文章目录 前言一、对象的类二、关联(Association)三、 连接属性(Link Attribute)四、关联类(Association Class)五、Qualification五、Generalisation参考文献Association • Link Attribute • Association Class • Qualification • Generalization 前言 在实际的项…

Python--GIL(全局解释器锁)

在Python中,GIL(全局解释器锁)是一个非常重要的概念,它对Python的多线程编程有着深远的影响。GIL是Python解释器级别的锁,用于保证任何时刻只有一个线程在执行Python字节码。这意味着即使在多核处理器上,Py…

Java Web 状态管理(上) Cookie基础

Java Web 状态管理(上) Cookie基础知识 前言一、Cookie产生的背景(不重要)二、Cookie简介三、Cookie的使用场景引入添加苹果进入购物车添加香蕉进入购物车那么假设说没有Cookie正常有Cookie的情况 四、场景简单模拟创建第一个Serv…

蓝桥杯备赛day02 -- 算法训练题 拿金币Java

目录 题目: 问题描述 输入格式 输出格式 解题过程 第一步 定义dp数组 第二步 确定 dp 数组递推公式 第三步 dp数组的初始化 第四步 dp数组的遍历顺序 第五步 举例说明 报错:内存超限 用dp数组去存储位置上的金币 dp数组从二维降为一维 收获&a…

Spark详解

Spark 概念 Spark 提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。 核心架构 Spark Core 包含 Spark 的基本功能;尤其是…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

A ConvNet for the 2020s

21世纪20年代的卷积神经网络 论文链接:https://arxiv.org/abs/2201.03545 项目链接:https://github.com/facebookresearch/ConvNeXt Abstract 视觉识别的“咆哮的20年代”始于视觉Transformer(ViT)的引入,它很快取代了卷积神经网络&#x…

Modbus协议

一.起源 Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种。其中Modbus TCP是在施耐德收购Mo…

数据结构之树和二叉树

树和二叉树的定义和存储 二叉树的遍历 先序遍历 中序遍历 后序遍历 层次遍历 哈夫曼树

Packet Tracer - Layer 2 VLAN Security

Packet Tracer - 第二层VLAN安全配置任务 目标 在SW-1和SW-2之间建立新的冗余链路。在新连接的SW-1和SW-2之间的干线链路上启用中继并配置安全措施。创建一个新的管理VLAN(VLAN 20)并将一台管理PC连接到该VLAN。实施ACL以防止外部用户访问管理VLAN。 背…

Linux命令之服务器的网络配置hostname,sysctl,ifconfig,service,ifdown,ifup,route,ping的使用

1、查看当前主机名称,编辑配置文件修改主机名为你姓名拼音的首字母(如张三,则为zs) 2、查看本机网卡IP地址,编辑/etc/sysconfig/network-scripts/ifcfg-ens33,要求在一块物理网卡上绑定2个IP地址&#xff0…

测试阶段风险不容忽视!QA角色关键时刻揭露项目隐患!

项目有风险 今天下午15点,团队成员D向他的主管Z反馈他测试的项目有风险:项目在测试周期内,但在用例评审时发现有一处功能逻辑有争议,需要产品经理跟业务方确认,可能出现的情况有: 1.不变更需求&#xff0…

day2·算法-快乐数-有效三角形个数

今天又来更新啦,准备蓝桥杯的小伙伴可以和我一起来刷题,建议大家先看题,整理出思路,再看如何用简单的写法将思路构建出来,然后优化细节,找到解决某些例外出现的方法,从而成功解答这道题。 快乐…

leetcode 67. 二进制求和

一、题目 二、解答 1.思路 1.1 思路1 转成2个二进制数字相加,之后再转回字符串 1.2 思路2 遍历字符串挨个相加: 补齐2个字符串到同样长度 while循环,如果指针>0不断循环如果a短,给字符串前插入(a长度-b长度&a…