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

如何消除Matplotlib线段两端填充并实现叠加条形图例?

解决Matplotlib水平叠加条形及线段端点超出、矩形图例问题

一、消除plot宽线段的端点超出问题

用plot绘制大线宽线段时,默认的线段端点样式(capstyle)是'projecting',这会导致端点超出设定的坐标范围。只需将线段的solid_capstyle参数设为'butt',就能让线段严格对齐设定的起止坐标,彻底消除额外填充。

示例代码:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
# 未修改capstyle的宽线会超出坐标
ax.plot([1, 3], [2, 2], linewidth=20, color='red')
# 修改后严格对齐起止坐标
ax.plot([1, 3], [3, 3], linewidth=20, color='blue', solid_capstyle='butt')

ax.set_xlim(0,4)
ax.set_ylim(1,4)
plt.show()

二、用矩形绘制并添加图例

如果想用矩形实现水平条形效果,给矩形加图例有两种简洁方法:

方法1:直接给矩形指定label参数

绘制矩形时直接设置label,最后调用ax.legend()即可自动生成图例:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

fig, ax = plt.subplots()
# 先绘制现有基础图(示例用散点图)
ax.scatter([1,2,3,4], [2,3,1,4], color='gray', label='原始数据')

# 叠加水平矩形(参数:x起始坐标, y起始坐标, 条形宽度, 条形高度)
rect1 = Rectangle((0.5, 2), 2, 0.3, color='orange', label='条形1')
rect2 = Rectangle((1, 3), 1.5, 0.3, color='green', label='条形2')
ax.add_patch(rect1)
ax.add_patch(rect2)

# 显示图例
ax.legend()
plt.show()

方法2:手动创建图例条目(适合批量绘制场景)

如果是循环批量绘制矩形,不想逐个设置label,可以手动创建图例条目:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

fig, ax = plt.subplots()
ax.scatter([1,2,3,4], [2,3,1,4], color='gray', label='原始数据')

# 批量定义矩形参数
rect_params = [
    ((0.5, 2), 2, 0.3, 'orange', '条形1'),
    ((1, 3), 1.5, 0.3, 'green', '条形2')
]

# 绘制所有矩形
for (x, y), w, h, color, _ in rect_params:
    ax.add_patch(Rectangle((x,y), w, h, color=color))

# 手动创建图例手柄并添加图例
handles = [plt.Rectangle((0,0),1,1, color=c) for _,_,_,c,_ in rect_params]
labels = [l for _,_,_,_,l in rect_params]
ax.legend(handles=handles, labels=labels)

plt.show()

三、方案选择建议

  • 若只需简单的水平线段式条形,用plot加solid_capstyle='butt'最便捷,直接指定label就能生成图例;
  • 若需要灵活调整条形的高度、圆角等样式,优先选择矩形+图例的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:32:43