如何获取pandas中dataframe.hist生成直方图的默认分箱区间
获取DataFrame.hist生成直方图的默认分箱区间
其实这个问题的核心在于理解DataFrame.hist()的底层实现——它本质上是对DataFrame的每一列调用Matplotlib的plt.hist(),只是帮你封装了多列子图的布局逻辑,所以我们可以从返回的子图对象里提取分箱信息,或者直接复用它的默认逻辑手动获取。
下面给你两种可行的方法:
方法一:从返回的子图对象中提取分箱区间
当你调用df.hist()时,会得到一个AxesSubplot对象(单列)或者Axes对象数组(多列)。每个子图的直方图由多个矩形(patch)组成,我们可以通过这些patch的位置和宽度来还原分箱区间:
import pandas as pd import numpy as np # 生成示例数据 df = pd.DataFrame(np.random.randn(1000, 2), columns=['A', 'B']) # 绘制直方图并获取子图数组 ax_array = df.hist() # 以第一列(A列)的子图为例 ax = ax_array[0][0] # 收集所有分箱的左边界 bins_left = [patch.get_x() for patch in ax.patches] # 获取最后一个分箱的右边界 last_bin_right = ax.patches[-1].get_x() + ax.patches[-1].get_width() # 合并为完整的分箱区间数组 bins = bins_left + [last_bin_right] print("A列的默认分箱区间:", bins)
如果是多列的情况,只需要遍历ax_array中的每个子图,重复上述步骤即可。
方法二:手动调用plt.hist复用默认逻辑
既然DataFrame.hist()是对每一列调用plt.hist(),那我们可以直接对单列数据调用plt.hist(),它会返回包含分箱区间的元组,这样更直接:
import matplotlib.pyplot as plt for col in df.columns: # plt.hist返回(频数数组, 分箱区间数组, 图形元素) counts, bins, patches = plt.hist(df[col]) print(f"{col}列的默认分箱区间:", bins) # 可以选择关闭当前图,避免重复绘制 plt.close()
补充说明
DataFrame.hist()返回子图对象是为了方便你后续调整图表样式(比如添加标题、修改刻度),而plt.hist()作为底层绘图函数,会直接返回统计计算的结果(频数、分箱)和图形元素。两者的默认分箱逻辑是完全一致的,所以两种方法得到的结果是相同的。
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

