Python:使用matplotlib绘制自定义区间的直方图
手动设置Matplotlib直方图区间解决方案
直接通过自定义bins数组来实现你的需求,以下是可运行的代码示例及关键说明:
import matplotlib.pyplot as plt import numpy as np # 模拟测试数据(替换成你的真实数据即可) np.random.seed(42) data = np.concatenate([ np.zeros(20), # 包含20个0值 np.random.uniform(1, 60, 100), # 0到60之间的随机数 np.random.uniform(61, 100, 30) # 大于60的随机数 ]) # 构造符合要求的区间数组 # - [-0.001, 0.001]:精准捕获所有0值(可根据数据精度调整范围) # - range(5, 61, 5):生成5、10...60,对应0<x≤5、5<x≤10...55<x≤60的区间 # - float('inf'):包含所有大于60的值 bins = [-0.001, 0.001] + list(range(5, 61, 5)) + [float('inf')] # 绘制直方图,设置柱子边界便于区分 plt.hist(data, bins=bins, edgecolor='black') # 自定义坐标轴标签,让区间显示更直观 labels = ['0'] + [f'{i}-{i+5}' for i in range(5, 60, 5)] + ['>60'] # 计算每个区间的中点作为标签位置,旋转45度避免重叠 plt.xticks([(bins[i] + bins[i+1])/2 for i in range(len(bins)-1)], labels, rotation=45) # 添加基础标注 plt.title('自定义区间直方图') plt.xlabel('数值区间') plt.ylabel('频数') # 自动调整布局,防止标签被截断 plt.tight_layout() plt.show()
关键说明:
- 0值单独区间:用极小的范围
[-0.001, 0.001]包裹0,确保只有0值会落入该区间,避免浮点精度问题; - 0-60区间分组:通过
range(5,61,5)生成步长为5的区间节点,刚好覆盖0<x≤60的所有数值; - 大于60的区间:用
float('inf')作为区间上限,自动收纳所有超过60的值; - 自定义标签:替换默认的区间数值标签为更易懂的文本,提升图表可读性。
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

