几个月来我一直在尝试用 Python 编写代码来确定图表的平均曲线。我所拥有的只是几张这样的图表。问题在于,虽然所有图表都具有相同的特征,但它们的长度不同,因此略有不同。例如,曲线一的长度为 4000 个点,而曲线二和三各大约有 7000-8000 个点。然而,正如我所提到的,曲线的特征是相同的,并且它们在图表上没有太大差异。
我已经尝试了很多方法来做到这一点。问题似乎是我可能不明白如何将它们全部对齐到单个 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 轴上。如果我解释一下这是一个使用相同样本的实验,这可能会更容易理解。
下面的数据+示例将来自不同轴的曲线插值到公共 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'])