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

