提问人:klv.anton 提问时间:11/14/2023 最后编辑:klv.anton 更新时间:11/15/2023 访问量:51
定义多个输入图的平均曲线
defining averaged curve of several input graphs
问:
几个月来,我一直在尝试用 Python 编写代码来确定图形的平均曲线。我所拥有的只是几个这样的图表。问题在于,虽然所有图形都具有相同的特征,但它们的长度不同,因此略有不同。例如,曲线 1 的长度为 4000 个点,而曲线 2 和 3 的长度约为 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)
更新:15.11.23
所以,问题是我不确定我想做的事情是否可行。想象一下,您有多个输入图,它们都有不同数量的点。它们不共享相同的 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'])
评论