如何消除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
相关产品推荐
相关产品推荐

