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

如何在hist2d中仅对Y轴使用对数间距的bins?

如何在hist2d中仅对Y轴使用对数间距的bins?

嘿,我完全懂你遇到的糟心情况——只给Y轴设log刻度但没调整bins的话,确实会出现底部bins超大、顶部bins挤成一条线的问题,因为hist2d默认的bins是线性划分的,和你后来改的轴刻度完全不搭。咱们来把这个问题解决掉:

问题根源

你之前的代码:

c = ax.hist2d(field[1], field[0], norm='log')
ax.set_yscale("log")

只是把Y轴的显示改成了对数刻度,但bins的划分逻辑还是线性的——也就是说,Y轴上的bins是均匀分布在原始线性数值上的,映射到对数轴上自然就会上下尺寸失衡。

解决方案:手动生成对数间距的Y轴bins

核心思路是:不给Y轴用默认线性bins,而是自己生成一组对数间距的bins,这样每个bin在对数尺度上的宽度是一致的。

方法1:用np.logspace自定义bins

先获取Y数据的范围,再用np.logspace生成等对数间距的bins:

import numpy as np
import matplotlib.pyplot as plt

# 提取你的Y轴数据
y_data = field[0]
# 处理Y数据为0的情况(避免log10(0)报错,加个极小偏移)
y_min = y_data.min()
if y_min <= 0:
    y_min = np.min(y_data[y_data > 0]) * 0.1  # 取最小正值的1/10作为下限
# 生成50个对数间距的Y bins(数量可以自己调)
y_bins = np.logspace(np.log10(y_min), np.log10(y_data.max()), 50)
# X轴用默认线性bins,或者自己指定数量/范围
x_bins = 50

# 绘制hist2d时指定自定义的bins
c = ax.hist2d(field[1], field[0], bins=[x_bins, y_bins], norm='log')
# 最后设置Y轴对数刻度
ax.set_yscale("log")

方法2:用np.histogram_bin_edges自动生成对数bins

如果你不想手动计算范围,可以用这个函数自动生成对数bins:

# 先处理Y数据含0的情况(避免报错)
y_data_clean = y_data[y_data > 0]
y_bins = np.histogram_bin_edges(y_data_clean, bins='log')
# 绘制时用clean后的bins逻辑,或者给原数据的0值单独处理
c = ax.hist2d(field[1], field[0], bins=[x_bins, y_bins], norm='log')
ax.set_yscale("log")

这个方法会根据数据自动选择合适的对数bins数量,更省心。

这样调整后,Y轴的bins在对数尺度上就是均匀分布的,不会再出现底部bins过大的问题啦~

备注:内容来源于stack exchange,提问作者Methil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:42:58