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
相关产品推荐
相关产品推荐

