Matplotlib - 在注释函数中设置箭头和文本之间的填充

时间:2014-04-28 15:20:01

标签: python matplotlib scipy

如何在matplotlib的注释功能中设置箭头和文本之间的距离(填充)?有时文本最终离箭头太近了,我想把它们稍微移开一点。

基本示例:

import matplotlib.pyplot as plt

plt.annotate('Here it is!',xy=(-1,-1),xytext=(0,0),
             arrowprops=dict(arrowstyle='->',lw=1.5))

plt.xlim(-10,10)
plt.ylim(-10,10)

plt.show()

enter image description here

3 个答案:

答案 0 :(得分:2)

您可以在arrowprops词典中使用shrink关键字参数,但不幸的是FancyArrowPatch对象不支持它,因此您必须删除arrowstyle='->'

shrink给出的值是提示/基座将远离xyxytext坐标的百分比。

import matplotlib.pyplot as plt

plt.annotate('Here it is!',xy=(-1,-1),xytext=(0,0),
             arrowprops=dict(lw=1.5, shrink=0.15))

plt.xlim(-10,10)
plt.ylim(-10,10)

plt.show()

答案 1 :(得分:1)

对于花式箭头,您可以使用bbox属性:

fig, ax = plt.subplots(1, 3, figsize=(7, 3))
pad_val = [-5, 0, 5]
for a,p in zip(ax, pad_val):
    a.annotate('Here it is!\npad={}'.format(p),xy=(-1,-1),xytext=(1,1),
                arrowprops=dict(arrowstyle='-|>', fc="k", ec="k", lw=1.5),
                bbox=dict(pad=p, facecolor="none", edgecolor="none"))
    a.set_xlim(-10,10)
    a.set_ylim(-10,10)

set pad between arrow and text in matplotlib annotate

这里的缺点是您无法在注释后面添加颜色(facecolor="none"是强制性的),或者箭头将始终粘在框架的边框上,它可能很难看。

HTH

答案 2 :(得分:0)

要完全控制距离,您必须结合 jrjcFfisegydd 答案。

Bbox 的 pad 属性定义了文本与其包含框之间的距离。箭头的 shrink 属性是箭头末端与框之间的距离,而不是文本本身。

此外,要将 shrinkFancyArrowPatch 一起使用,您必须单独定义它:shrinkA 表示原点(靠近文本的箭头末端),shrinkB 表示原点目的地。 来自demo in Matplotlib's website

 ax.annotate("",
             xy=(x1, y1), xycoords='data',
             xytext=(x2, y2), textcoords='data',
             arrowprops=dict(arrowstyle="->", color="0.5",
                             shrinkA=5, shrinkB=5,
                             patchA=None, patchB=None,
                             connectionstyle=connectionstyle,
                             ),
             )

所以完整的答案是:

plt.annotate('Example text',
             xy=(-1,-1), xytext=(0,0),
             arrowprops=dict(arrowstyle='->', shrinkA=0.15),
             bbox=dict(pad=0),
    )

示例:

Influence of Bbox pad and arrow shrink parameters on distance of arrow to text