我试图将低分辨率曲线(10个数据点)线性插值到更高的分辨率(~1000个数据点)。我想要的是具有相同形状但具有更多x和y值的新曲线,即当绘制为线时,高分辨率曲线和低分辨率曲线看起来难以区分。
我多次使用Numpy的插值,所以这让我感到困惑。我按常规np.interp(newX, oldX, oldY)
进行操作,但是当我绘制它时,我得到了一个有趣的结果。
绿色方块之间的线条应该是直的,而不是像这样的拱形。
我不确定它是否重要,但我的X值范围从0到1000,我的Y值范围从1e-12到1e-16。任何建议将不胜感激!
更新:上面的图是对数对数刻度,但它也发生在线性图上。
这是实际数据。 (它真的是1e-15到1e-19):
X = array([ 0.3543 , 0.477 , 0.544579, 0.6231 , 0.64142 ,
0.7625 , 0.79788 , 0.9134 , 1.02894 , 1.235 ,
1.241608, 1.615118, 1.662 , 2.159 , 2.181858,
3.4 , 3.507511, 3.732206, 4.436578, 4.6 ,
4.664426, 5.628102, 7.589159, 12. ])
Y = array([ 8.54633502e-19, 3.82388943e-18, 7.33750003e-18,
2.98683733e-17, 7.77237551e-17, 2.04059657e-16,
3.72124584e-16, 8.77407275e-16, 1.65824812e-15,
2.48616026e-15, 2.80165491e-15, 2.03270375e-15,
2.03205199e-15, 1.24592352e-15, 1.20231667e-15,
3.85565084e-16, 4.34827044e-16, 3.86967563e-16,
1.67622220e-16, 1.48774069e-16, 1.25065750e-16,
7.53511540e-17, 2.34138998e-17, 5.77852724e-18])
所以我确信它确实只是一个对数尺度效应。但是出于某些原因,当我使用ax.loglog()
进行绘制然后执行ax.set_yscale('linear')
时,轴刻度会发生变化,但子绘图数据不会变化。当我使用ax.plot()
绘制它时,它看起来很好。
任何人都能解释一下吗?
答案 0 :(得分:2)
翻译自http://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1000,10)
y = np.random.uniform(1e-16, 1e-12, 10)
xvals = np.linspace(0, 1000, 100)
yinterp = np.interp(xvals, x, y)
plt.plot(x, y, c='k')
plt.plot(xvals, yinterp, 'o', c='w')
plt.show()
答案 1 :(得分:2)
我也有同样的问题,但是有scipy的interpolate.interp1d。问题不在于代码,而在于对数的工作原理。线性图上的直线在半对数图上变为曲线。考虑一下极限情况,你只想在半月图和连接上绘制两个点(ya,xa)和(yb,xb)。如果您首先在这些点之间进行线性插值,则创建一个对象,该对象是一个线段 L(x)(例如,由一个精细网格点数组表示)。然后,如果您记录 L 的日志并将其与 x 进行对比,那么您将获得一条曲线。这就是" bouncy"附加情节上的行为。如果你想在日志图中有一条直线,你需要记录 ya 和 yb ,插值,然后绘图。如果您正在查看跨越数十年的内容,您可能希望在获取日志后进行插值,但这可能取决于您的应用程序。