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

Matplotlib:平移/缩放时保留注释线段的可见部分

Matplotlib注释箭头局部裁剪实现方案

问题描述

运行以下代码生成带注释箭头的图表,平移窗口后,即便注释线段仍有部分在可视范围内,整个注释也会完全消失。测试annotation_clip=True时行为无变化,设为False则会显示全部注释(包含超出轴范围的部分),需求是仅保留注释线段在可视区域内的部分。

示例代码

import matplotlib as mpl
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.subplots()

ax.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2])

ax.annotate("", xy=(0,0), xytext=(1,1), arrowprops=dict(facecolor='black'))

ax.set_ylabel('some numbers')
ax.set_xlim([0,5])
ax.set_ylim([0,2])
plt.show()

解决方案

Matplotlib原生annotate的裁剪逻辑是将注释作为整体处理,只要锚点超出轴范围就会完全隐藏。我们可以改用FancyArrowPatch单独绘制带箭头的线段,并为其设置基于轴可视范围的裁剪路径,实现局部裁剪效果。

修改后的代码如下:

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

fig = plt.figure()
ax = fig.subplots()

ax.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2])

# 用FancyArrowPatch替代annotate,创建带箭头的线段
arrow_patch = FancyArrowPatch((1, 1), (0, 0), arrowstyle='->', color='black')
ax.add_patch(arrow_patch)
# 设置裁剪路径为当前轴的显示区域,仅保留可视范围内的部分
arrow_patch.set_clip_path(ax.patch)

ax.set_ylabel('some numbers')
ax.set_xlim([0,5])
ax.set_ylim([0,2])
plt.show()

说明

  • FancyArrowPatch可灵活绘制带箭头的线段,支持自定义箭头样式、颜色等属性
  • set_clip_path(ax.patch)会让patch仅在轴的可视区域内显示,平移窗口时,超出可视范围的部分会被自动裁剪,保留可见的线段部分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:42:20