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

如何自动将直方图X轴限制为预定bins的非空区域

自动调整直方图X轴至有数据区间的解决方案

针对预设bins范围过大导致X轴出现大量空区间的问题,我们可以通过自动定位有数据的bin边界,实现批量处理100张直方图的需求:

修改后的完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

def plot_Diff(data):
    fig = plt.figure(figsize=(10, 10))
    ax = fig.add_subplot(423)  
    x = data['O18ad']  # 改用传入参数,适配批量处理不同数据集
    bins = [-20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1]
    
    # 绘制直方图
    bin_counts, _, bars = ax.hist(x, bins, alpha=0.65, label='old', edgecolor='black', color='lightgrey')
    
    # 自动计算X轴有效范围
    x_min = x.min()
    x_max = x.max()
    # 定位数据对应的bin索引,确定左右边界
    bin_indices = np.digitize(x, bins)
    min_bin_idx = bin_indices.min()
    max_bin_idx = bin_indices.max()
    x_left = bins[min_bin_idx - 1]
    x_right = bins[max_bin_idx]
    ax.set_xlim(x_left, x_right)  # 缩放到有数据的区间
    
    # 优化Y轴刻度逻辑
    new_max_tick = bin_counts.max()
    manual_ticks = [0, 20_000]
    if manual_ticks is None:
        old_yticks = ax.get_yticks()
        new_ticks = old_yticks[old_yticks < new_max_tick][:-1]
        new_ticks = np.append(new_ticks, new_max_tick)
    else:
        new_ticks = np.append(manual_ticks, new_max_tick)
    ax.set_yticks(new_ticks)
    
    ax.legend()  # 添加图例提升可读性

# 调用示例(传入你的数据集dfe)
plot_Diff(dfe)
plt.show()

关键逻辑说明

  • 自动定位有效区间:通过np.digitize()获取每个数据点对应的bin索引,取索引的最小/最大值,从而得到包含所有数据的最左/最右bin边界,用ax.set_xlim()直接砍掉空区间。
  • 适配批量处理:将全局变量dfe改为函数参数data,循环处理100个数据集时只需逐个传入即可。
  • 简化冗余代码:合并重复的Y轴刻度计算逻辑,保持原有需求的同时让代码更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:00:54