You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib plt.bar绘制重叠柱状图时r2显示异常求助

排查你的直方图绘制问题

先帮你拆解一下为什么r2会呈现两种不同的图表效果,主要是这几个代码细节导致的:

1. 对比子图中两个柱状图完全重叠

在第三个子图(plt.subplot(2,2,3))里,你连续调用了两次plt.bar,而且用的是完全相同的x轴位置ka,宽度也都设为1.0。这就意味着后绘制的r2柱状图会直接盖在r1上面——如果r1的数值普遍比r2大,你几乎看不到r2;如果r2有部分数值更高,也只能看到那些“冒头”的部分,这和单独绘制r2的子图效果肯定不一样。

2. 子图间的y轴范围自动调整差异

Matplotlib的plt.bar会根据当前子图的数据自动适配y轴范围。单独画r2的子图(第二个子图),y轴是跟着r2的数值分布走的;但在对比子图里,y轴要同时容纳r1和r2的最大值,要是r1的数值远大于r2,r2的柱状条会被压缩得特别矮,视觉上和单独的r2子图差异极大。

3. 高密度x轴的显示差异

你的ka是长度3500的数组,每个子图要画3500个柱状条。Matplotlib会根据子图大小自动调整x轴的刻度显示数量和间隔,不同子图的x轴缩放程度不一样,也会让你觉得r2的图表效果有变化。


修复方案

针对这些问题,你可以这样修改代码:

解决重叠问题:错开柱状图位置

把对比子图里的两个柱状图偏移x轴位置,同时缩小宽度,让它们并排显示:

comp = plt.subplot(2,2,3)
comp.set_title("Compare Histograms: ")
comp.set_xlabel("Visual words")
comp.set_ylabel("Frequency")
# 设置宽度和偏移,避免重叠
bar_width = 0.4
plt.bar(ka - bar_width/2, r1, width=bar_width, color='orangered')
plt.bar(ka + bar_width/2, r2, width=bar_width, color='mediumslateblue')
# 添加图例区分两个系列
comp.legend([r1title, r2title])

统一y轴范围(可选)

如果你希望对比子图里r2的显示和单独子图一致,可以手动同步y轴范围:

# 绘制完第二个子图后,获取它的y轴范围
y_min, y_max = his.get_ylim()
# 给对比子图设置相同的y轴范围
comp.set_ylim(y_min, y_max)

优化x轴显示(避免标签重叠)

3500个刻度太密集,你可以手动设置刻度间隔:

# 比如每500个刻度显示一个标签,所有子图都可以这么处理
tick_interval = 500
hiq.set_xticks(ka[::tick_interval])
hiq.set_xticklabels(ka[::tick_interval])
his.set_xticks(ka[::tick_interval])
his.set_xticklabels(ka[::tick_interval])
comp.set_xticks(ka[::tick_interval])
comp.set_xticklabels(ka[::tick_interval])

内容的提问来源于stack exchange,提问作者Furin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:07:08