作为一个没话语权的甲方,感觉要被乙方和用户逼死~~~
首先事情是这样的:用户提了一个需求,里面需要4个点连成一条曲线,乙方觉得4个点怎么连曲线,给我100个点我再试试看咯,并要求我们给出曲线公式。那问题来了,这个曲线弧度多大,用户不知道公式啊。只知道要平滑连接~~于是就引发本次的学习之路
第一步,怎么也要先把线连起来吧,是不是曲线不管:
import numpy as np
import math
import matplotlib.pyplot as plt
x1=[1,2,3,4]
y1=[3,3.2,2.1,4]
#定义x轴范围,点数个数
a=np.linspace(min(x1),max(x1),100)
#用插值函数,计算纵坐标的值
b=np.interp(a,x1,y1)
plt.plot(x1, y1, 'o') #蓝色的点
plt.plot(a,b, color='r')
plt.show()
那这折线有了怎么变成曲线?众所周知,曲线其实就是很多点连起来,点多了看上去就平滑了,于是我去百度了一波,看了一下别人画的曲线
import numpy as np
import matplotlib.pyplot as plt
#定义X轴范围,坐标-4到4,点数1024个
x1 = np.linspace(-4,4, 1024)
y1 = .25 * (x1 + 4.) * (x1 + 1.) * (x1 - 2.)
#plt.plot(x1, y1,'o')
plt.plot(x1, y1,'r')
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.show()
曲线是曲线,但是我不能用啊,这是按照公式走的图,并不会过我指定的点。
后来查资料看到了scipy库,感觉发现了新大陆,interp1d函数可以直接拟合数值,这结合一下,岂不是美滋滋?
import numpy as np
# 实现插值的模块
from scipy import interpolate
# 画图的模块
import matplotlib.pyplot as plt
# 生成随机数的模块
import random
x=[1,2,3,4]
y=[3,3.2,2.1,8]
a=np.linspace(min(x),max(x),1000)
#b=np.interp(a,x,y)
"""
kind方法:
nearest、zero、slinear、quadratic、cubic
实现函数func
"""
#func = interpolate.interp1d(x, y, kind='cubic')
#cubic和quadratic画出来弧度不一样,取需哈
func = interpolate.interp1d(x, y, kind='quadratic')
b=func(a)
# 画图部分
# 原图
plt.plot(x, y, 'o')
# 拟合之后的平滑曲线图
plt.plot(a, b,'r')
plt.show()