How to draw cubic spline in matplotlib

前端 未结 2 1118
臣服心动
臣服心动 2020-12-18 04:10

I want to connect the following points using smooth line, say cubic spline

points = [(3.28,0.00),(4.00,0.50),(4.40,1.0),(4.60,1.52),(5.00,2.5),(         


        
相关标签:
2条回答
  • 2020-12-18 04:59

    This is pretty much following the circle example here.

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import interpolate
    
    def annotate_points(ax, A, B):
        for xy in zip(A, B):
            ax.annotate('(%s, %s)' % xy, xy=xy, textcoords='offset points')
    
    points = [(3.28,0.00),(4.00,0.50),(4.40,1.0),(4.60,1.52),(5.00,2.5),(5.00,3.34),(4.70,3.8)]
    points = points + [(4.50,3.96),(4.20,4.0),(3.70,3.90),(3.00,3.5),(2.00,2.9)]
    x, y = zip(*points)
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.scatter(x, y, color='black')
    annotate_points(ax, x, y)
    
    tck,u = interpolate.splprep([x, y], s=0)
    unew = np.arange(0, 1.01, 0.01)
    out = interpolate.splev(unew, tck)
    
    plt.plot(x, y, 'orange', out[0], out[1])
    plt.legend(['connect the dots', 'cubic spline'])
    
    plt.show()
    

    enter image description here

    0 讨论(0)
  • 2020-12-18 05:03

    You need to take a parametric approach, like this:

    enter image description here

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import interpolate
    
    points = [(3.28,0.00),(4.00,0.50),(4.40,1.0),(4.60,1.52),(5.00,2.5),(5.00,3.34),(4.70,3.8)]
    points = points + [(4.50,3.96),(4.20,4.0),(3.70,3.90),(3.00,3.5),(2.00,2.9)]
    data = np.array(points)
    
    tck,u = interpolate.splprep(data.transpose(), s=0)
    unew = np.arange(0, 1.01, 0.01)
    out = interpolate.splev(unew, tck)
    
    plt.figure()
    plt.plot(out[0], out[1], color='orange')
    plt.plot(data[:,0], data[:,1], 'ob')
    plt.show()
    

    This is basically just reworked from the last example in the section here.

    0 讨论(0)
提交回复
热议问题