'make_interp_spline' 两点之间的线下降
'make_interp_spline' line dropping between two points
我正在绘制一些点,为了使绘图更流畅,我正在使用 'make_interp_spline'。问题是我在前两点之间得到一条下降线。其他点没问题,距离都一样。有什么我可以做的吗?
Ps: 我只有 10 和 30 的数据。
我的代码:
import matplotlib
import pylab as pl
from pylab import *
import numpy as np
from scipy.interpolate import make_interp_spline
x1, y1 = np.loadtxt('Grafico_I_D_Fe.txt', dtype=float, delimiter=',', unpack=True)
B_spline_coeff1 = make_interp_spline(x1, y1)
X1_Final = np.linspace(x.min(), x.max(), 500)
Y1_Final = B_spline_coeff1(X1_Final)
pl.plot(X1_Final, Y1_Final, color='r', label=r'Iron ( \times 10^7$)')
pl.scatter(x1, y1, marker='*', color='r')
数据:
10, 3.187170532786709e-15
30, 1.031832270812154e-13
50, 3.444779276423242e-13
70, 6.316369610195546e-14
剧情:
插值函数经常有不直观的 属性 摆动。在您的情况下,插值曲线低于零,但数据点没有。
存在许多其他插值或近似函数,每种函数在特定情况下都有自己的优点和缺点。 PchipInterpolator
就是这样一个函数,它试图保持在数据点的范围内(但二阶导数不太好)。
下面的代码使用 PchipInterpolator
,但也获取输入 y-values 的日志,并通过 exp
对结果反转该操作。在不取对数的情况下,摇摆不定的二阶导数更明显。
from matplotlib import pyplot as plt
import numpy as np
from scipy.interpolate import PchipInterpolator
x1 = [10, 30, 50, 70]
y1 = [3.187170532786709e-15, 1.031832270812154e-13, 3.444779276423242e-13, 6.316369610195546e-14]
B_spline_coeff1 = PchipInterpolator(x1, np.log(y1))
X1_Final = np.linspace(9, 71, 500)
Y1_Final = np.exp(B_spline_coeff1(X1_Final))
plt.plot(X1_Final, Y1_Final, color='r', label=r'Iron ( \times 10^7$)')
plt.scatter(x1, y1, marker='*', color='r')
plt.yscale('log')
plt.show()
PS:看来对于这些特定的数据点,原来的make_interp_spline
在使用对数转换的时候效果比PchipInterpolator
还要好。通常情况并非如此,您可能需要考虑其他插值或近似函数。
B_spline_coeff1 = make_interp_spline(x1, np.log(y1))
X1_Final = np.linspace(9, 71, 500)
Y1_Final = np.exp(B_spline_coeff1(X1_Final))
plt.plot(X1_Final, Y1_Final, color='r', label=r'Iron ( \times 10^7$)')
plt.scatter(x1, y1, marker='*', color='r')
plt.yscale('log')
plt.show()
我正在绘制一些点,为了使绘图更流畅,我正在使用 'make_interp_spline'。问题是我在前两点之间得到一条下降线。其他点没问题,距离都一样。有什么我可以做的吗?
Ps: 我只有 10 和 30 的数据。
我的代码:
import matplotlib
import pylab as pl
from pylab import *
import numpy as np
from scipy.interpolate import make_interp_spline
x1, y1 = np.loadtxt('Grafico_I_D_Fe.txt', dtype=float, delimiter=',', unpack=True)
B_spline_coeff1 = make_interp_spline(x1, y1)
X1_Final = np.linspace(x.min(), x.max(), 500)
Y1_Final = B_spline_coeff1(X1_Final)
pl.plot(X1_Final, Y1_Final, color='r', label=r'Iron ( \times 10^7$)')
pl.scatter(x1, y1, marker='*', color='r')
数据:
10, 3.187170532786709e-15
30, 1.031832270812154e-13
50, 3.444779276423242e-13
70, 6.316369610195546e-14
剧情:
插值函数经常有不直观的 属性 摆动。在您的情况下,插值曲线低于零,但数据点没有。
存在许多其他插值或近似函数,每种函数在特定情况下都有自己的优点和缺点。 PchipInterpolator
就是这样一个函数,它试图保持在数据点的范围内(但二阶导数不太好)。
下面的代码使用 PchipInterpolator
,但也获取输入 y-values 的日志,并通过 exp
对结果反转该操作。在不取对数的情况下,摇摆不定的二阶导数更明显。
from matplotlib import pyplot as plt
import numpy as np
from scipy.interpolate import PchipInterpolator
x1 = [10, 30, 50, 70]
y1 = [3.187170532786709e-15, 1.031832270812154e-13, 3.444779276423242e-13, 6.316369610195546e-14]
B_spline_coeff1 = PchipInterpolator(x1, np.log(y1))
X1_Final = np.linspace(9, 71, 500)
Y1_Final = np.exp(B_spline_coeff1(X1_Final))
plt.plot(X1_Final, Y1_Final, color='r', label=r'Iron ( \times 10^7$)')
plt.scatter(x1, y1, marker='*', color='r')
plt.yscale('log')
plt.show()
PS:看来对于这些特定的数据点,原来的make_interp_spline
在使用对数转换的时候效果比PchipInterpolator
还要好。通常情况并非如此,您可能需要考虑其他插值或近似函数。
B_spline_coeff1 = make_interp_spline(x1, np.log(y1))
X1_Final = np.linspace(9, 71, 500)
Y1_Final = np.exp(B_spline_coeff1(X1_Final))
plt.plot(X1_Final, Y1_Final, color='r', label=r'Iron ( \times 10^7$)')
plt.scatter(x1, y1, marker='*', color='r')
plt.yscale('log')
plt.show()