如何自动将直方图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
相关产品推荐
相关产品推荐

