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

