Matplotlib.pyplot中绘图中的箭头

18

我无法按照自己的意愿显示箭头。 以下是我尝试实现的示例:

import matplotlib.pyplot as plt
import numpy as np

b = np.arange(5)*-1E-4
a = np.arange(5)

fig, ax = plt.subplots()
ax.plot(a,b, linewidth=3, color="k") 
plt.arrow(1,-0.00010,0,-0.00005, shape='full', lw=3, length_includes_head=True, head_width=.01)
plt.show()

据我理解,这应该产生一个起点为(1,-0.00010),终点为(1,-0.00015)的箭头。 但结果是一条更长的线,不再像箭头,也没有在正确的点开始和停止。

enter image description here


我假设你在.arrow调用中的错误缩进不是真实代码中的情况? - Mark
我的猜测是这是 0 的 dx。你的箭头没有宽度。 - Mark
@Mark 如果箭头有宽度,它将显示与y轴一样长,如我在帖子中链接的图像所示(我是stackoverflow的新手,因此使用链接而不是图像)。 - K. Soerensen
你能把这个程序改成 [mcve] 格式,并解释一下你想要的图形是什么样的吗? - DavidG
@DavidG 我现在编辑了问题,希望这样能更好地解释我的问题 :) - K. Soerensen
2个回答

22
由于您使用了如此小的比例尺,一些参数在未明确传递给plt.arrow的情况下将使用它们的默认值,而在您的情况下,这将不会产生良好的结果。
查看文档,如果没有传递width的值,则默认值为0.001,那么头宽将为0.003,头长将为0.0015。因为头宽太小并且使用默认值,而头长太长,所以会获得问题中看到的输出。
因此,您需要传递head_widthhead_length参数:
plt.arrow(1, -0.00010, 0, -0.00005, length_includes_head=True,
          head_width=0.08, head_length=0.00002)

这提供了:

在此输入图片描述


非常感谢! 我实际上希望将箭头向另一个方向旋转,以便箭头在起点处。我尝试过“head_starts_at_zero”,但这个命令似乎也存在问题。有什么建议吗? - K. Soerensen
@K.Soerensen 我也无法让 head_starts_at_zero 生效,可能是个 bug 吧?不过你可以改变坐标来让箭头朝另一个方向:plt.arrow(1, -0.00015, 0, 0.00005, ...) - DavidG
关于head_starts_at_zero的含义,也许可以通过这个问题仔细阅读一下。另外,请查看该问题线程的最后一条评论,以了解我在这里建议做什么。 - ImportanceOfBeingErnest

9
您可以使用annotate绘制箭头。详见matplotlib文档
a = np.linspace(-2,2, 100)
plt.plot(a, a**2)
plt.annotate("here", xy=(0, 0), xytext=(0, 2), arrowprops=dict(arrowstyle="->"))

有一些错误,箭头的长度显示不正确。 - mathtick
1
DavidG的回答解释了原问题中缩放的问题。前三行是通用答案。重新测试后,它的表现与我预期的完全一致。 - Marcel Flygare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接