宇宙学模拟中网格点到Mpc/h单位的映射方法求助
网格点到物理单位(Mpc/h)的映射方案
核心转换逻辑
你的需求是把0-128的网格坐标线性映射到0-100 Mpc/h,这是一个简单的线性缩放问题,公式非常直接:物理坐标 = (网格坐标 / 总网格数) * 模拟盒大小
代入你的参数(总网格数128,模拟盒大小100 Mpc/h),具体公式为:mpc_h = (grid_pos / 128) * 100
Python实现与应用方法
1. 定义通用转换函数
可以写一个轻量函数处理单个值或批量数组:
def grid_to_mpch(grid_pos, box_size=100, grid_size=128): return (grid_pos / grid_size) * box_size
该函数支持单个数值、NumPy数组、Pandas序列等多种输入类型的批量转换。
2. 直接应用到Matplotlib等高线图
如果是从头绘制图表,直接用转换后的物理坐标生成图像:
import matplotlib.pyplot as plt import numpy as np # 示例:假设你的密度场数据是128x128的数组 density_field = np.random.rand(128, 128) # 生成原始网格坐标 x_grid = np.arange(128) y_grid = np.arange(128) # 转换为Mpc/h单位的物理坐标 x_mpch = grid_to_mpch(x_grid) y_mpch = grid_to_mpch(y_grid) # 绘制等高线图 plt.contourf(x_mpch, y_mpch, density_field) # 设置坐标轴属性 plt.xlabel('X (Mpc/h)') plt.ylabel('Y (Mpc/h)') plt.xlim(0, 100) plt.ylim(0, 100) plt.colorbar(label='Density') plt.show()
3. 修改已绘制图表的刻度
如果已经生成了以网格点为轴的图表,可直接替换刻度标签:
# 获取当前坐标轴对象 ax = plt.gca() # 处理X轴 original_x_ticks = ax.get_xticks() new_x_ticks = grid_to_mpch(original_x_ticks) ax.set_xticks(original_x_ticks) ax.set_xticklabels([f'{tick:.1f}' for tick in new_x_ticks]) ax.set_xlabel('X (Mpc/h)') # 处理Y轴 original_y_ticks = ax.get_yticks() new_y_ticks = grid_to_mpch(original_y_ticks) ax.set_yticks(original_y_ticks) ax.set_yticklabels([f'{tick:.1f}' for tick in new_y_ticks]) ax.set_ylabel('Y (Mpc/h)') plt.draw()
注意事项
- 如果你的网格索引从1开始(而非0),需先将网格坐标减1再代入公式:
mpc_h = ((grid_pos - 1)/128)*100 - 线性映射仅适用于均匀网格,这也是宇宙学模拟中最常见的网格设置
内容的提问来源于stack exchange,提问作者Manos Bougioukoglou
相关产品推荐
相关产品推荐

