Python画球面投影图

news2024/11/18 6:02:54

天文学研究中,有时候需要画的并不是传统的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的官方文档,官方文档里是有教程的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将 RGB 转换为十六进制、生成随机十六进制

RGB与十六进制 RGB(Red, Green, Blue)和十六进制是两种常用的颜色表示方式。 RGB是一种加法混色模式,它通过调节红、绿、蓝三个颜色通道的亮度来混合出各种颜色。对于每个颜色通道,取值范围是0到255,0表示该通道对应…

如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

SpringCloud Aliba-Nacos-从入门到学废【2】

🥚今日鸡汤🥚 比起不做而后悔,不如做了再后悔。 ——空白《游戏人生》 目录 🧈1.Nacos集群架构说明 🧂2.三种部署模式 🍿3.切换到mysql 1.在nacos-server-2.0.3\nacos\conf里找到nacos-mysql.sql 2.查…

【Docker篇】从0到1搭建自己的镜像仓库并且推送镜像到自己的仓库中

文章目录 🔎docker私有仓库🍔具体步骤 🔎docker私有仓库 Docker私有仓库的存在为用户提供了更高的灵活性、控制和安全性。与使用公共镜像仓库相比,私有仓库使用户能够完全掌握自己的镜像生命周期。 首先,私有仓库允许…

数据结构与算法教程,数据结构C语言版教程!(第四部分、字符串,数据结构中的串存储结构)一

第四部分、字符串,数据结构中的串存储结构 串存储结构,也就是存储字符串的数据结构。 很明显,字符串之间的逻辑关系也是“一对一”,用线性表的思维不难想出,串存储结构也有顺序存储和链式存储。 提到字符串&#xff…

人脸识别为何老是不过?是什么原因导致的?

人脸识别可能无法通过的原因有很多,以下是可能的一些原因: 1. 非常规面部表情:如果你做出了与常规面部表情不同的表情,如张大嘴巴或瞪大眼睛等,可能会干扰人脸识别系统的准确性。 2. 光线条件:人脸识别系统…

[牛客周赛复盘] 牛客周赛 Round 28 20240114

[牛客周赛复盘] 牛客周赛 Round 28 20240114 总结A\B1. 题目描述2. 思路分析3. 代码实现 小红的炸砖块1. 题目描述2. 思路分析3. 代码实现 小红统计区间(easy)1. 题目描述2. 思路分析3. 代码实现 小红的好数组1. 题目描述2. 思路分析3. 代码实现 小红统…

电子学会C/C++编程等级考试2023年09月(六级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:生日相同 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。 时间限制:1000 内存限制:65536 输入 第一行为整数n,表示有n个学生,n ≤ 180。此后每行包含一…

数据库系统课设——教务管理系统

目录 前言 一、总体设计 1、知识背景 2、模块介绍(需求分析) 3、设计步骤 3.1 页面原型设计 3.2 前端页面开发 3.3 后端接口开发 3.4 数据库设计 二、详细设计 1、 系统功能模块划分 2、 数据流程图 3、数据库概念结构设计 4、 数据库逻辑…

python统计分析——操作案例(模拟抽样)

参考资料:用python动手学统计学 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seaborn as snsdata_setpd.read_csv(r"C:\python统计学\3-4-1-fish_length_100000.csv")[length] #此处将文件路径改为自己的路…

格密码基础:SIS问题的困难性

目录 一. SIS问题的困难性 二. SIS问题归约的性质 2.1 2004年 [MR04] 2.2 2008年 【GPV08】 2.3 2013年【MP13】 三. 归约证明 3.1 核心理解 3.2 归约步骤 3.3 性质理解 一. SIS问题的困难性 推荐先阅读: 格密码基础:SIS问题的定义与理解-CSD…

数据仓库(3)-模型建设

本文从以下9个内容,介绍数据参考模型建设相关内容。 1、OLTP VS OLAP OLTP:全称OnLine Transaction Processing,中文名联机事务处理系统,主要是执行基本日常的事务处理,比如数据库记录的增删查改,例如mysql、oracle…

C++面试宝典第19题:最长公共前缀

题目 编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串""。说明:所有输入只包含小写字母a-z。 示例1: 输入: ["flower", "flow", "flight"]输出: "fl" 示例2: 输入: ["dog",…

进阶Docker2:数据卷和挂载目录

目录 准备 删除容器 创建并运行一个容器 数据卷(Volumes) 挂载数据卷 虚拟机端口映射 挂载目录(Bind mounts) 挂载目录 挂载文件 部署在线项目 docker 在容器中管理数据主要有两种方式: - 数据卷&#xff0…

第一次在RUST官方论坛上留言发布我的Rust板箱

第一次在RUST官方论坛上发帖子,有点紧张~地址在这里: 【My Rust Crate】obtains linux local information - The Rust Programming Language Forum (rust-lang.org)

codeforces (C++ Satisfying Constraints)

题目: 翻译: 思路: 1、找到最大的下限min 2、找到最小的上限max 3、则max-min1满足1、2约束条件的个数 4、max-min1减去约束条件3的个数,即为最终答案 5、如果min大于max,则结果为0,不存在满足约束条件的数…

BuildRoot配置RTL8822CE WIFIBT模块(WIFI部分)

TinkerBoard2主板自带的无线模块为RTL8822CE,PCIe接口 之前在风火轮下载的Linux源码编译出来的BuildRoot根文件系统没有相关的驱动文件 [rootrk3399:/]# find . -name *.ko [rootrk3399:/]# lsmod Module Size Used by Not tainted [rootrk33…

流星全自动网页生成系统重构版源码

流星全自动网页生成系统重构版源码分享,所有模板经过精心审核与修改,完美兼容小屏手机大屏手机,以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 为用户使用方便考虑,全自动网页制作系统无需繁琐…

专业课140总分410+大连理工大学852信号与系统考研经验电子信息与通信

通过将近一年的复习,今年如愿以专业140分,总分410被大连理工录取,回望这一年复习还是有很多做的不足,整理了一下自己复习的经验,希望可以对后面报考大连理工的同学有所帮助。●政治: 真心建议大家至少暑假…

android.os.NetworkOnMainThreadException

问题 android.os.NetworkOnMainThreadException详细问题 核心代码如下: import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ja…