定义多个输入图的平均曲线

问题描述 投票:0回答:1

几个月来我一直在尝试用 Python 编写代码来确定图表的平均曲线。我所拥有的只是几张这样的图表。问题在于,虽然所有图表都具有相同的特征,但它们的长度不同,因此略有不同。例如,曲线一的长度为 4000 个点,而曲线二和三各大约有 7000-8000 个点。然而,正如我所提到的,曲线的特征是相同的,并且它们在图表上没有太大差异。 Here you can see the curves

我已经尝试了很多方法来做到这一点。问题似乎是我可能不明白如何将它们全部对齐到单个 x 轴。例如,在图像中,您会看到

x_average[-1] 

应该约为 8。但是,当我对较小的图形进行插值时,它们不会伸展;他们只是画一条直线到终点,而较长的则被修剪。我还尝试将图表标准化为最大的 x 值,但我对结果不满意。总的来说,如果有人能给我建议如何将具有不同点数的 4-5 条曲线转换为显示平均值的单条曲线,我将非常感激。

P.s.我是编程方面的绝对新手,所以我想做的事情可能是不可能的,但我将不胜感激任何信息。

sum = 0
for ii in displacement:
    sum += ii[-1]
  
new_x = np.linspace(0, sum/len(selected_files), 1000)
print(new_x)
new_ys = []
for jj in range(len(ys)):
    new_y = np.interp(new_x, displacement[jj], ys[jj])
    new_ys.append(new_y)
print(new_ys)

再次尝试将它们带到一个 x 轴

new_disp =[]
new_ys = []    
for ii, jj in zip(displacement, ys):
    a = np.linspace(0, ii[-1], 100)
    new_disp.append(a)
    b = np.interp(a, ii, jj)
    new_ys.append(b)
    plt.plot(a,b)
    print(a)
    print(b)

x = np.mean(new_disp, axis=0)
y = np.mean(new_ys, axis=0)

更新:23.11.15

所以,问题是我不确定我想做的事情是否可能。假设您有多个输入图,并且它们都有不同数量的点。它们不共享相同的 x 和 y 点,这意味着它们可能具有不同的 x 和 y 最大值。然而,它们在开始时都具有相似的曲线特征和斜率。我正在尝试对所有 x 值和 y 值进行平均。但正如我已经提到的,它们都有不同数量的积分。我尝试将它们全部对齐在一个 x 轴上。如果我解释一下这是一个使用相同样本的实验,这可能会更容易理解。

我上传了另一张图片来澄清我的意思。我绘制的平均曲线代表了我想要实现的目标 - 它就像所有轴上的平均曲线。 Here

graph data-science average smoothing curve
1个回答
0
投票

下面的数据+示例将来自不同轴的曲线插值到公共 x 轴上。

import numpy as np
import matplotlib.pyplot as plt

#Test data
x0 = np.linspace(0.1, 10, 1000)
x1 = x0[::10]
x2 = x1[::5]
probe0 = np.log(x0) * np.cos(x0) ** 2 + 3
probe1 = np.log(x1 * 0.7) * np.cos(x1 + 0.5) ** 2 + 3
probe2 = np.log(x2 * 0.3) * np.cos(x2 + 0.5) ** 2 + 3

plt.plot(x0, probe0, x1, probe1, x2, probe2)

#Put axes and lines into lists
x_axes = [x0, x1, x2]
probes = [probe0, probe1, probe2]

#Find the limits to use for a common axis
# i.e. what is the min and max across all axes?
axis_min = np.inf
axis_max = -np.inf

for axis in x_axes:
    if axis.min() < axis_min:
        axis_min = axis.min()
    if axis.max() > axis_max:
        axis_max = axis.max()

#Create a common axis
n_points = 1200
common_x = np.linspace(axis_min, axis_max, n_points)

#Interpolate each curve onto the common axis
interpolated_curves = np.zeros([len(probes), len(common_x)])

for index in range(len(probes)):
    interpolated_curves[index, :] = np.interp(common_x, x_axes[index], probes[index])

#Average the interpolated curves
average_curve = interpolated_curves.mean(axis=0)

plt.plot(common_x, average_curve, linewidth=5, c='k')
plt.legend(['probe0', 'probe1', 'probe2', 'average'])
© www.soinside.com 2019 - 2024. All rights reserved.