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

Matplotlib并列柱状图添加linewidth后重叠问题求助

解决Matplotlib并列柱状图添加linewidth后重叠的问题

问题原因

给bar()设置linewidth(或lw)参数时,柱子的边框会绘制在柱子宽度的外侧。你原来的代码通过手动偏移shift实现并列,但没有预留边框的额外空间,导致相邻柱子的边框相互重叠。

解决方案

方法1:使用align='edge'精准控制位置(推荐)

通过设置align='edge',柱子的位置参数代表柱子的左边缘而非中心。直接将第二组柱子的起始位置设为第一组柱子的右边缘,即可避免边框重叠:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, figsize=(3,2), dpi=300)
bar_width = 0.35
lw = 2

# 第一组柱状图:左边缘对应0、1、2
ax.bar([0, 1, 2], [2, 2, 2], bar_width, lw=lw, color='blue', ec='darkblue', align='edge')
# 第二组柱状图:左边缘为第一组的右边缘(原位置+宽度)
ax.bar([x + bar_width for x in [0,1,2]], [2,2,2], bar_width, lw=lw, color='red', ec='darkred', align='edge')

# 调整x轴刻度到两组柱子的中间位置
ax.set_xticks([x + bar_width/2 for x in [0,1,2]])
ax.set_xticklabels(['0', '1', '2'])

plt.show()

方法2:转换linewidth单位并调整偏移量

如果需要保留默认的align='center',可以将linewidth的点单位转换为数据单位,手动增加偏移量预留边框空间:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, figsize=(3,2), dpi=300)
shift = 0.2
lw = 2

# 将linewidth从点(默认单位)转换为x轴的数据单位
x_pixel_len = ax.get_window_extent().width
x_data_len = ax.get_xlim()[1] - ax.get_xlim()[0]
lw_pixels = lw * fig.dpi / 72
lw_data = lw_pixels * x_data_len / x_pixel_len

# 调整偏移量,预留边框空间
adjusted_shift = shift + lw_data

ax.bar([0-adjusted_shift,1-adjusted_shift,2-adjusted_shift], [2,2,2], 2*shift, lw=lw, color='blue', ec='darkblue')
ax.bar([0+adjusted_shift,1+adjusted_shift,2+adjusted_shift], [2,2,2], 2*shift, lw=lw, color='red', ec='darkred')

# 调整x轴范围,确保柱子完整显示
ax.set_xlim(-adjusted_shift - shift, 2 + adjusted_shift + shift)
plt.show()

说明

方法1无需单位转换,逻辑更清晰,是处理此类问题的常规方案;方法2适合需要保留align='center'的场景,但需注意动态调整轴范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:20:07