【问题标题】:How can I place an arrow at the end of the curve in matplotlib?如何在 matplotlib 曲线的末端放置一个箭头?
【发布时间】:2017-04-25 20:59:42
【问题描述】:

我想要曲线旁边的箭头。例如:

import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(0,4*np.pi,10000)
Y = np.sin(X)

shift = 0.1
seg_size = 300

i = 0
plt.plot(X,Y,color='blue')
while i +seg_size < len(X):
    x = X[i:i+seg_size]
    y = Y[i:i+seg_size]+shift
    plt.plot(x,y,color='black')
    #input here command for arrow head
    i += seg_size*2

plt.show()

我试图计算曲线末端直线的角度并绘制箭头线,但我做错了,箭头变形了。有什么提示吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    FancyArrowPatch 类将路径作为参数,所以我认为您可以使用它。

    1) 为每个线段创建一个matplotlib.path.Path 实例。

    2) 使用路径实例绘制箭头。

    import numpy as np
    import matplotlib.pyplot as plt; plt.ion()
    from matplotlib.patches import FancyArrowPatch, PathPatch
    from matplotlib.path import Path
    
    def create_path(x,y):
        vertices = zip(x,y)
        codes = [Path.MOVETO] + (len(vertices)-1) * [Path.CURVE3]
        return Path(vertices, codes)
    
    X = np.linspace(0,4*np.pi,10000)
    Y = np.sin(X)
    
    fig, ax = plt.subplots(1,1)
    ax.plot(X,Y,color='blue')
    
    shift = 0.1
    seg_size = 300
    
    i = 0
    while i +seg_size < len(X):
        x = X[i:i+seg_size]
        y = Y[i:i+seg_size]+shift
    
        path = create_path(x,y)
    
        # for testing path 
        # patch = PathPatch(path, facecolor='none', lw=2)
        # ax.add_patch(patch)
    
        arrow = FancyArrowPatch(path=path, color='r')
        ax.add_artist(arrow)
    
        i += seg_size*2
    

    不幸的是,这不起作用,因为传递给 FancyArrowPatch 的路径不能超过 2 个段(未记录,但在 ensure_quadratic_bezier 中有一个检查)。

    所以你必须作弊。下面我使用每个段的最后 2 个点来绘制箭头。

    import numpy as np
    import matplotlib.pyplot as plt; plt.ion()
    from matplotlib.patches import FancyArrowPatch
    
    X = np.linspace(0,4*np.pi,10000)
    Y = np.sin(X)
    
    fig, ax = plt.subplots(1,1)
    ax.plot(X,Y,color='blue')
    
    shift = 0.1
    seg_size = 300
    
    i = 0
    while i +seg_size < len(X):
        x = X[i:i+seg_size]
        y = Y[i:i+seg_size]+shift
    
        ax.plot(x, y, 'k')
    
        posA, posB = zip(x[-2:], y[-2:])
        edge_width = 2.
        arrowstyle = "fancy,head_length={},head_width={},tail_width={}".format(2*edge_width, 3*edge_width, edge_width)
        arrow = FancyArrowPatch(posA=posA, posB=posB, arrowstyle=arrowstyle, color='k')
        ax.add_artist(arrow)
    
        i += seg_size*2
    

    【讨论】:

      【解决方案2】:

      如何使用

      numpy.annotate() 
      

      功能?

      在此处查看 pyplot.annotate() 函数创建的箭头示例:

      https://matplotlib.org/examples/pylab_examples/annotation_demo.html

      【讨论】:

      • numpypyplot?您提供的链接是针对后者的,它不允许将曲线变成箭头,只能变成直线。我可以“作弊并在曲线的末端放置注释。
      • 如果我们取曲线的终点并作为pyplot注释的起点(箭头),它会起作用吗?
      • 是的,我做了类似的事情,点不能太远,因为曲线并不总是接近线性
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 2014-11-11
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多