numpy 在同一图上为多个数据集绘制最佳拟合线

44u64gxh  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(202)

我试图在多个数据集之间近似一条最佳拟合线,并在一个图上显示所有内容。这个question解决了类似的概念,但内容在MatLab中,因此不一样。
我有来自4个不同实验的数据,这些数据由146值组成,Y值表示距离随时间的变化,X值由整数时间步长(1,2,3,...)表示,Y数据的形状是(4,146),因为我决定将所有数据保存在一个嵌套列表中,我的X数据的形状是(146,)。我的子图设置如下:

x = [i for i in range(len(temp[0]))]
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.scatter(x,Y[0],c="blue", marker='.',linewidth=1)
ax1.scatter(x,Y[1],c="orange", marker='.',linewidth=1)
ax1.scatter(x,Y[2],c="green", marker='.',linewidth=1)
ax1.scatter(x,Y[3],c="purple", marker='.',linewidth=1)

z = np.polyfit(x,Y,3) # Throws an error because x,Y are not the same length
p = np.poly1d(z)
plt.plot(x, p(x))

我不知道如何拟合散点图之间的最佳拟合线。numpy.polyfit文档建议“Several data sets of sample points sharing the same x-coordinates can be fitted at once“,但到目前为止我还没有成功,只能将该线拟合到一个数据集。是否有方法可以将该线拟合到所有数据集?我是否应该使用完全不同的库,如Seaborn?

jm2pwxwz

jm2pwxwz1#

尝试将xY强制转换为numpy数组(我假设它在一个列表中)。您可以使用x = np.asarray(x)来完成此操作。现在要对数据进行集体拟合,你可以使用Y.flatten()来展平Y数组,它将形状从(n,N)转换为(n*N)。你可以把x数组平铺n次来拟合,这只是把n数组复制到一个新数组中,所以它也会变成形状(n*N,),这样你就把Y的值和x的对应值匹配了。

N = 10 # no. datapoints
n = 4  # no. experiments

# creating some dummy data
x = np.linspace(0,1, N)  # shape (N,)
Y = np.random.normal(0,1,(n, N))

np.polyfit(np.tile(x, n), Y.flatten(), deg=3)
o8x7eapl

o8x7eapl2#

polyfit函数期望Y数组是(146, 4),而不是(4, 146),所以你应该把Y的转置传给它,例如:

z = np.polyfit(x, Y.T, 3)

poly1d函数一次只能执行一个多项式,因此必须循环polyfit的结果,例如:

for res in z:
    p = np.poly1d(res)
    plt.plot(x, p(x))

相关问题