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

如何调整直方图分箱,解决低质量星系质量显示为0及X轴刻度不均问题?

问题描述
  • 绘制低质量星系质量直方图时,质量小于1太阳质量的星系被显示为0太阳质量,希望让这些低质量值正常显示,同时将质量区间放大到0-3太阳质量。
  • 尝试绘制简单直方图,但X轴刻度不均匀,不清楚原因。

尝试的代码

plotlist = [] 
for halo in simSats:
    mvir = simSats[halo]['Mvir']
    plotlist.append(mvir)
plotlist = np.asarray(plotlist)
plt.hist(plotlist)

数据输出

[1.75353080e+10 1.03454986e+10 1.17512034e+10 9.68613814e+09
 6.40655649e+09 5.04409401e+09 3.82798081e+09 5.80222974e+09
 1.04027038e+10 1.79983011e+10 1.95137540e+10 1.78910879e+10
 1.27659438e+10 1.81947913e+10 1.39142197e+10 1.13183104e+10
 1.03982277e+10 8.63489862e+09 7.42876035e+09 5.22600018e+09
 7.85432543e+09 4.75491031e+09 7.78396769e+09 9.69021839e+09
 4.93969876e+10 1.43326361e+10 1.63058245e+10 3.20865485e+09
 4.37412955e+09 1.14915472e+10 1.88181032e+10 4.67712244e+09
 1.13262254e+10 7.06200967e+09 8.49164480e+09 1.01777059e+10
 1.98494915e+10 6.07897332e+09 1.80687635e+10 4.31756164e+09
 6.01830299e+09 4.24692572e+09 6.61822346e+09 2.01933360e+10
 6.65404721e+09 4.35807966e+09 2.31729702e+10 1.79621449e+10
 4.97159178e+09 6.10014339e+09 5.74926372e+10 3.87533252e+10
 3.33590476e+09 5.43237319e+10 2.45991599e+10 1.26613191e+10
 1.09971690e+10 7.81951398e+09 1.22671623e+10]
解决方案

1. 解决低质量显示为0的问题

从输出的plotlist数据来看,所有数值都是10^9量级,说明你当前的质量单位是10亿太阳质量,而非太阳质量。这就是小于1太阳质量的星系显示为0的原因——在10亿太阳质量的尺度下,1太阳质量可忽略不计。

解决步骤:

  • 先将数据转换为太阳质量单位;
  • 筛选0-3太阳质量的样本,手动指定bins绘制直方图:
# 转换为太阳质量
plotlist_solar = plotlist / 1e9
# 筛选0-3太阳质量的样本
low_mass = plotlist_solar[(plotlist_solar >= 0) & (plotlist_solar <= 3)]
# 绘制直方图,指定均匀分布的bins
plt.hist(low_mass, bins=np.linspace(0, 3, 31))  # 31个bin对应0-3太阳质量,步长0.1
plt.xlabel('质量 (太阳质量)')
plt.ylabel('数量')
plt.xlim(0, 3)
plt.show()

2. 解决X轴刻度不均匀的问题

默认的plt.hist()会自动选择bins,当数据分布范围过大时(比如你的原始数据跨度从3e9到5e10),自动bins会导致刻度不均匀。解决方法是手动指定bins的范围和数量:

  • 若查看全范围数据,可使用对数刻度和对数分布的bins:
plt.hist(plotlist, bins=np.logspace(np.log10(plotlist.min()), np.log10(plotlist.max()), 50))
plt.xscale('log')
plt.xlabel('质量 (10^9 太阳质量)')
plt.ylabel('数量')
plt.show()
  • 若只关注低质量区间,使用上述筛选后的low_mass数据,配合linspace生成均匀bins,再通过xlim锁定X轴范围,即可得到均匀刻度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:15:41