Python如何基于分箱binning和频率表绘制直方图histogram
基于已有的分箱和频率表绘制直方图的实现方法
你已经完成了分箱和频率统计,不需要再使用hist方法的自动统计逻辑,直接用条形图即可模拟出完全一致的直方图效果,具体实现代码如下:
import pandas as pd import matplotlib.pyplot as plt freq = [3,14,21,12,6] i = pd.interval_range(start=50, freq=10, end=100, closed='left') df = pd.DataFrame(index=i, data=freq) df.columns = ['Freq'] df.index.name = 'Class' df.columns.name = 'Column' print(df) # 绘制直方图部分 # 取每个区间的左端点作为x轴位置 x = [interval.left for interval in df.index] # 条形宽度设为区间长度,和直方图效果一致 width = 10 plt.bar(x, df['Freq'], width=width, align='edge', edgecolor='black') # 设置x轴刻度为区间标签,更易读 plt.xticks(x, labels=df.index, rotation=45) plt.xlabel('分箱区间') plt.ylabel('频率') plt.title('基于预计算分箱和频率的直方图') plt.tight_layout() plt.show()
实现逻辑说明
- 因为已经提前统计好每个分箱的频率,直接使用
plt.bar绘制是最高效的方式,不需要重复做统计计算 align='edge'参数让条形的边缘对齐分箱边界,完全贴合直方图的展示逻辑- 加入
edgecolor='black'给每个条形加边框,和常规直方图的展示样式统一
如果你确实需要调用hist方法实现,也可以通过还原模拟原始数据的方式实现,代码如下:
# 还原模拟原始数据:每个区间的数值重复对应的频率次数 raw_data = [] for interval, count in zip(df.index, df['Freq']): raw_data.extend([interval.left] * count) # 调用hist方法绘制,指定和之前一致的分箱边界 plt.hist(raw_data, bins=[50,60,70,80,90,100], edgecolor='black') plt.xlabel('分箱区间') plt.ylabel('频率') plt.show()
内容的提问来源于stack exchange,提问作者Say OL
相关产品推荐
相关产品推荐

