我一直在寻找答案的一段时间,并且已经接近但仍然遇到错误。有很多类似的问题几乎可以回答这个问题,但是我一直无法解决。任何帮助或朝着正确方向的观点表示赞赏。
我有一张图,显示温度是深度的主要非线性函数,而x和y值取自 Pandas 数据框。
import matplotlib.pyplot as plt
x = (22.81, 22.81, 22.78, 22.71, 22.55, 22.54, 22.51, 22.37)
y = (5, 16, 23, 34, 61, 68, 77, 86)
#Plot details
plt.figure(figsize=(10,7)), plt.plot(style='.-')
plt.title("Temperature as a Function of Depth")
plt.xlabel("Temperature"), plt.ylabel("Depth")
plt.gca().invert_yaxis()
plt.plot(x,y, linestyle='--', marker='o', color='b')
这给了我一张像这样的图像(注意,因为我在谈论深度,所以翻转了y轴):
我想在特定的x值22.61下找到y值,这不是数据集中的原始温度值之一。我尝试了以下步骤:
np.interp(22.61, x1, y1)
这给了我一个我知道是不正确的值,
s = pd.Series([5,16,23,34,np.nan,61,68,77,86], index=[22.81,22.81,22.78,22.71,22.61,22.55,22.54,22.51,22.37])
s.interpolate(method='index')
我试图在其中设置框架并强制插值的地方。我也试过了
line = plt.plot(x,y)
xvalues = line[0].get_xdata()
yvalues = line[0].get_ydata()
idx = np.where(xvalues==xvalues[3]) ## 3 is the position
yvalues[idx]
但这会为已列出的特定x值返回y值,而不是内插的值。
我希望这足够清楚。我是数据科学和stackoverflow的新手,所以如果我需要改写这个问题,请告诉我。
最佳答案
您确实可以使用 numpy.interp
函数。如文档所述
因此,在使用此功能之前,您需要对x数组上的数组进行排序。
# Sort arrays
xs = np.sort(x)
ys = np.array(y)[np.argsort(x)]
# x coordinate
x0 = 22.61
# interpolated y coordinate
y0 = np.interp(x0, xs, ys)
完整的代码:
import numpy as np
import matplotlib.pyplot as plt
x = (22.81, 22.81, 22.78, 22.71, 22.55, 22.54, 22.51, 22.37)
y = (5, 16, 23, 34, 61, 68, 77, 86)
# Sort arrays
xs = np.sort(x)
ys = np.array(y)[np.argsort(x)]
# x coordinate
x0 = 22.61
# interpolated y coordinate
y0 = np.interp(x0, xs, ys)
#Plot details
plt.figure(figsize=(10,7)), plt.plot(style='.-')
plt.title("Temperature as a Function of Depth")
plt.xlabel("Temperature"), plt.ylabel("Depth")
plt.gca().invert_yaxis()
plt.plot(x,y, linestyle='--', marker='o', color='b')
plt.plot(x0,y0, marker="o", color="C3")
关于python - 插值时间序列,从x中选择y值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50583392/