Matplotlib 如何删除FancyArrowPatch箭头尖端和目标点之间的空白?

Matplotlib 如何删除FancyArrowPatch箭头尖端和目标点之间的空白?,matplotlib,Matplotlib,在拍摄一些箭头的图像时,我注意到箭头在指定的点之间没有达到全长 例如: import matplotlib.pyplot as plt import matplotlib as mpl fig, ax = plt.subplots() fig.set_size_inches(5, 5) w = 0.001 h = 1000 ax.set_xlim(0, w) ax.set_ylim(0, h) ax.add_artist(mpl.patches.FancyArrowPatch(

在拍摄一些箭头的图像时,我注意到箭头在指定的点之间没有达到全长

例如:

import matplotlib.pyplot as plt
import matplotlib as mpl

fig, ax = plt.subplots()
fig.set_size_inches(5, 5)

w = 0.001
h = 1000

ax.set_xlim(0, w)
ax.set_ylim(0, h)

ax.add_artist(mpl.patches.FancyArrowPatch(
    (w*1/3, h*0.0),
    (w*1/3, h*1.0),
    edgecolor='black',
    facecolor='red',
    arrowstyle=mpl.patches.ArrowStyle.CurveFilledAB(head_length=10, head_width=10)
))
ax.add_artist(mpl.patches.FancyArrowPatch(
    (w*2/3, h*0.0),
    (w*2/3, h*1.0),
    edgecolor='black',
    facecolor='red',
    arrowstyle=mpl.patches.ArrowStyle.Simple(head_length=10, head_width=10, tail_width=1)
))
plt.savefig(
    'main.svg',
    format='svg',
    bbox_inches='tight',
    dpi=100,
)
产生:

这是浏览器缩放箭头的屏幕截图,显示箭头未触及上方的黑线:

如何让他们在没有空白的情况下准确地触摸

在matplotlib上测试==3.2.2

相关问题:


  • shrinkA=0
    shrinkB=0

    这是箭头不接触的第一个主要直接原因

    这些值默认为
    2
    ,可能是因为箭头最初主要用于需要一些空间的注释中

    如果我将它们设置为零:

    FancyArrowPatch(
        shrinkA=0,
        shrinkB=0,
    
    然后箭头接触,如所示:

    A代表箭头的起点,B代表箭头的终点

    线宽的影响

    但是,要记住的另一件事是,
    线宽
    也会影响箭头是否触及某个对象

    例如,如果我在原始代码中添加了一个夸张的
    linewidth=10

    FancyArrowPatch(
        shrinkA=0,
        shrinkB=0,
        linewidth=10,
    
    结果是:

    因此,我们注意到:

    • 边的跟踪始终是圆角的,因此箭头不再是尖的,而是以较大的线宽圆角
    • Simple
      CurveFilledAB
      有不同的绘制算法:用于
      Simple
      的算法使箭头超出目标,而
      CurveFilledAB
      使其处于运行状态
    • 上面的线宽太宽了,以至于它隐藏了红色的内部颜色
    对于
    Simple
    ,如果不需要不同的边框颜色,可以使用
    linewidth=0
    返回尖箭头,并使用
    tail\u width
    控制主箭头的线宽

    这不适用于
    CurveFilledAB
    但是:该样式的绘图算法是将边框单独用于主箭头线,因此我不确定如何在不获得圆角的情况下单独控制双头箭头的主线宽度,除了画两个更难看的简单箭头外:似乎可以通过添加一个新的
    SimpleAB
    类来修补

    结果:

    FancyArrowPatch(
        shrinkA=0,
        shrinkB=0,
        linewidth=0,
    
    是: