Matplotlib直方图xticks与bins不匹配,柱子重叠问题求助
直方图区间柱重叠问题解决方案
使用plt.hist绘制直方图时,出现区间柱(bins)重叠的情况,已尝试调整坐标轴尺寸和width参数,问题仍未解决。
用户代码如下:
import numpy as np import matplotlib.pyplot as plt # 假设data和loc是已定义变量 intervals = np.arange(0.5, max(data)+0.5, .5) data = np.array(data) # build labels list labels = [ str(intervals[i])+'-'+str(intervals[i+1]) for i in range(len(intervals)-1) ] labels.append(str(max(intervals))+'-'+str(max(intervals)+.5)) # plot fig, ax = plt.subplots(figsize=(12, 9)) plt.hist(x=data, bins=intervals, width=1) ax.set_xticks(range(len(intervals))) ax.set_xticklabels(labels=labels, rotation=45, fontsize=12) ax.set_title("Max wind speed ~24hr before dust emission ("+loc+")", fontsize=18) ax.set_xlabel('Wind Speed [m/s]', fontsize=14) ax.set_ylabel('No. of Events', fontsize=14) plt.grid(True) plt.tight_layout() plt.savefig('th_hist'+loc+'.png') plt.show()
问题原因及解决方法
- 重叠核心原因:你设置的
width=1和bins的间隔(0.5)完全不匹配。bins的区间步长是0.5,柱子宽度设为1会直接超出自身区间,和相邻柱子重叠。 - 修正步骤:
- 移除width参数:plt.hist会根据bins的间隔自动计算合适的柱子宽度,手动指定反而会导致错位。
- 修正刻度与标签对应关系:当前把刻度放在
range(len(intervals))是基于索引的位置,和实际的风速数值轴不对应,会导致标签错位。应该把刻度放在每个区间的中间位置,或者直接对应bins的分界点。 - 简化标签生成:不需要额外append最后一个标签,原列表推导式已经覆盖了
intervals所有相邻元素组成的区间,额外添加会导致标签数量比区间数多一个,和刻度不匹配。
修正后的代码
import numpy as np import matplotlib.pyplot as plt intervals = np.arange(0.5, max(data)+0.5, .5) data = np.array(data) # 生成对应所有区间的标签,无需额外添加 labels = [f"{intervals[i]:.1f}-{intervals[i+1]:.1f}" for i in range(len(intervals)-1)] fig, ax = plt.subplots(figsize=(12, 9)) # 移除width参数,让matplotlib自动适配,添加edgecolor让柱子边界更清晰 plt.hist(x=data, bins=intervals, edgecolor='black') # 将刻度放在每个区间的中间位置,和标签一一对应 ax.set_xticks(intervals[:-1] + 0.25) ax.set_xticklabels(labels, rotation=45, fontsize=12) ax.set_title(f"Max wind speed ~24hr before dust emission ({loc})", fontsize=18) ax.set_xlabel('Wind Speed [m/s]', fontsize=14) ax.set_ylabel('No. of Events', fontsize=14) plt.grid(True, axis='y') # 只显示y轴网格,避免x轴网格和柱子重叠 plt.tight_layout() plt.savefig(f'th_hist{loc}.png') plt.show()
内容的提问来源于stack exchange,提问作者Doron bs
相关产品推荐
相关产品推荐

