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

使用np.meshgrid与matplotlib的ax.pcolormesh可视化飞行时间实验数据出错

问题排查与修复方案

错误原因分析

结合你的描述和飞行时间(ToF)可视化的常见问题,问题大概率出在以下两点:

  1. pcolormesh的网格边界不匹配
    pcolormesh是基于单元格边界坐标绘制的,若你直接用能量的中心值计算ToF并作为X轴坐标,会导致网格顶点位置偏移——尤其是低能区(对应长ToF),因为能量与ToF是平方根反比关系,低能区的ToF变化率远高于高能区,中心值与边界值的差异被放大,最终出现右上角顶点错位的问题。
  2. 飞行时间与能量的转换逻辑可能存在误差
    若ToF的计算公式推导错误(比如单位转换遗漏、常数使用错误),会直接导致坐标计算偏差,且低能区的ToF数值更大,误差表现更明显。

修复方案

1. 修正网格生成逻辑

改用能量的边界值生成ToF网格,确保pcolormesh的单元格边界与物理坐标完全对应:

import numpy as np
import matplotlib.pyplot as plt

# 实验参数
flight_length = 10  # 中子飞行距离,单位:米
E_min = 1  # 最小能量,单位:eV
E_max = 100  # 最大能量,单位:eV
num_bins = 100  # 能量分箱数

# 生成能量边界数组(比中心值多一个点)
E_edges = np.linspace(E_min, E_max, num_bins + 1)
# 计算每个能量边界对应的ToF(使用正确的转换公式)
# 中子静止能量m_nc²≈939.565 MeV,光速c=3e8 m/s,转换为微秒需乘1e6
ToF_edges = flight_length * np.sqrt(939.565e6 / (2 * E_edges)) / 3e8 * 1e6

# 假设Y轴为探测器位置维度,同样生成边界
Y_min = 0
Y_max = 10
Y_edges = np.linspace(Y_min, Y_max, 50 + 1)

# 生成二维网格边界
X_edges, Y_edges_grid = np.meshgrid(ToF_edges, Y_edges)
# 生成能量中心值用于颜色映射(可选,也可用边界的平均值)
E_centers = (E_edges[:-1] + E_edges[1:]) / 2
E_grid = np.tile(E_centers, (len(Y_edges)-1, 1))

# 绘图
fig, ax = plt.subplots(figsize=(10,6))
# 使用边界网格绘制pcolormesh
pcm = ax.pcolormesh(X_edges, Y_edges_grid, E_grid, shading='flat')
# 添加最小能量对应的ToF虚线
ax.axvline(ToF_edges[0], linestyle='--', color='k', label=f'E_min={E_min} eV')

plt.colorbar(pcm, label='Neutron Energy (eV)')
ax.set_xlabel('Time of Flight (μs)')
ax.set_ylabel('Detector Position')
ax.legend()
plt.show()

2. 验证转换公式的正确性

确保ToF的计算公式符合物理规律:
$$\text{ToF} = L \times \sqrt{\frac{m_n c^2}{2E}} / c$$
其中:

  • $L$:飞行距离(米)
  • $m_n c^2$:中子静止能量(≈939.565 MeV)
  • $E$:中子能量(eV)
  • $c$:光速(3e8 m/s)
    转换为微秒时需乘以$10^6$。

3. 可选优化:使用对数分箱(针对低能区)

若低能区的分辨率需求更高,可对能量使用对数分箱,避免线性分箱导致低能区ToF网格过于稀疏:

# 替换线性分箱为对数分箱
E_edges = np.logspace(np.log10(E_min), np.log10(E_max), num_bins + 1)

关键说明

  • shading='flat'确保每个单元格颜色均匀,避免插值导致的视觉误差;
  • 必须保证X_edges和Y_edges_grid的形状为(M+1, N+1),而E_grid的形状为(M, N),完全匹配pcolormesh的输入要求;
  • 低能区误差放大的本质是ToF与能量的非线性关系,使用边界坐标而非中心值是解决顶点错位的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:06:11