如何基于Pandas qcut分箱结果绘制展示分箱区间的直方图?
如何基于Pandas qcut分箱结果绘制直方图?
当然可以实现啦!你已经通过pd.qcut()得到了分箱后的计数结果qc_val,直接用Matplotlib或者Seaborn就能轻松画出对应的分箱直方图,下面给你几种实用的实现方式:
方法一:基于分箱计数绘制条形图(直观展示每个区间样本数)
你的qc_val已经是按分箱区间排序好的计数数据,直接用Matplotlib的bar函数就能绘制,代码可以直接接在你现有代码后面:
# 设置绘图风格(可选,让图表更美观) plt.style.use('ggplot') # 创建画布和坐标轴 fig, ax = plt.subplots(figsize=(10, 6)) # 绘制条形图:x轴为分箱区间的字符串形式,y轴为对应样本数 bars = ax.bar(qc_val.index.astype(str), qc_val.values) # 给每个条形添加数值标签,方便查看具体数量 for bar in bars: height = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2., height, f'{height}', ha='center', va='bottom') # 设置图表标题和轴标签 ax.set_title('Active字段分箱计数直方图', fontsize=14) ax.set_xlabel('分箱区间', fontsize=12) ax.set_ylabel('样本数量', fontsize=12) # 旋转x轴标签,避免区间文本重叠 plt.xticks(rotation=45, ha='right') # 自动调整布局,防止标签被截断 plt.tight_layout() plt.show()
小细节说明:
- 因为
qc_val的索引是Pandas的Interval类型,直接用作x轴会显示异常,所以用astype(str)转成字符串格式; - 添加数值标签能让每个区间的样本数一目了然;
- 旋转x轴标签是为了避免长区间文本互相重叠。
方法二:用Seaborn绘制更美观的分箱直方图
如果想要更简洁的代码和更精致的样式,Seaborn是个不错的选择,先确保你已经安装了Seaborn(pip install seaborn),然后代码如下:
import seaborn as sns plt.figure(figsize=(10, 6)) # 绘制条形图,自动处理x轴标签 sns.barplot(x=qc_val.index.astype(str), y=qc_val.values, palette='viridis') # 设置图表元素 plt.title('Active字段分箱计数直方图', fontsize=14) plt.xlabel('分箱区间', fontsize=12) plt.ylabel('样本数量', fontsize=12) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
额外技巧:基于原始数据结合qcut分箱边界绘制直方图
如果你想展示原始数据的分布形态,同时对齐qcut生成的分箱边界,可以直接用原始数据绘制直方图,并指定分箱边界:
plt.figure(figsize=(10, 6)) # 提取qcut的分箱边界:左边界列表 + 最后一个区间的右边界 bins = [interval.left for interval in qc_val.index] + [qc_val.index[-1].right] # 绘制原始数据的直方图,指定分箱边界 plt.hist(dataset['Active'], bins=bins, edgecolor='black', alpha=0.7) # 设置图表元素 plt.title('Active字段直方图(qcut分箱边界)', fontsize=14) plt.xlabel('Active数值', fontsize=12) plt.ylabel('样本数量', fontsize=12) plt.tight_layout() plt.show()
这样就能看到原始数据在你指定的分箱区间里的分布情况啦!
内容的提问来源于stack exchange,提问作者Fury
相关产品推荐
相关产品推荐

