gpt4 book ai didi

python - 带插值的 Matplotlib 二维图

转载 作者:行者123 更新时间:2023-11-28 21:58:48 27 4
gpt4 key购买 nike

我正在尝试创建一个绘图来显示水平面上的温度梯度。我能够降低颜色,但它并没有按照我需要的方式进行插值。 This question有助于创建情节。似乎在制作情节时这些点的权重不相等。 This是图表当前的样子。它应该看起来像颜色条,因为顶部的两个点是 23.7,底部的两个点是 23.4。我使用的代码是: enter image description here

   xi, yi = np.linspace(xm, xM, 500), np.linspace(ym, yM, 500)
xi, yi = np.meshgrid(xi, yi)
xo=[0, 0, 2, 2]
yo=[0, 2, 0, 2]
ao=[23.4, 23.7, 23.4, 23.7]
rbf = scipy.interpolate.Rbf(xo, yo, ao, function='linear')
ai = rbf(xi, yi)

plt.xlabel('X')
plt.ylabel('Y')

plt.imshow(ai, vmin=am, vmax=aM, origin='lower', extent=[xm, xM, ym, yM])

plt.scatter(xo, yo, c=ao)
plt.colorbar()
plt.show()

最佳答案

扩展我之前的评论:

发生这种情况是因为您的 a 值的绝对值比 xy 值大 ~10 倍。

这会在求解适当的权重时导致数值稳定性问题。 Scipy 可能应该做一些健全性检查并“美化”(又名重新缩放)输入数据,但它没有。

由于权重不正确,插值低于最小输入 a 值(线性 RBF 不应发生这种情况)。正如 @user1767344 所注意到的,这会导致您指定的 vminvmax 值“剪切”网格。我在下面显示“未剪辑”版本,但如果您指定类似的 vminvmax,您将看到与原始示例相同的结果。

举个例子:

import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

def main():
x = np.array([0, 0, 2, 2])
y = np.array([0, 2, 0, 2])
a = np.array([23.4, 23.7, 23.4, 23.7])
xi, yi = np.mgrid[x.min():x.max():500j, y.min():y.max():500j]

a_orig = normal_interp(x, y, a, xi, yi)
a_rescale = rescaled_interp(x, y, a, xi, yi)

plot(x, y, a, a_orig, 'Not Rescaled')
plot(x, y, a, a_rescale, 'Rescaled')
plt.show()

def normal_interp(x, y, a, xi, yi):
rbf = scipy.interpolate.Rbf(x, y, a)
ai = rbf(xi, yi)
return ai

def rescaled_interp(x, y, a, xi, yi):
a_rescaled = (a - a.min()) / a.ptp()
ai = normal_interp(x, y, a_rescaled, xi, yi)
ai = a.ptp() * ai + a.min()
return ai

def plot(x, y, a, ai, title):
fig, ax = plt.subplots()

im = ax.imshow(ai.T, origin='lower',
extent=[x.min(), x.max(), y.min(), y.max()])
ax.scatter(x, y, c=a)

ax.set(xlabel='X', ylabel='Y', title=title)
fig.colorbar(im)

main()

enter image description here enter image description here

两者之间的唯一区别只是在 0 和 1 之间线性重新调整输入和输出 a 值:

def normal_interp(x, y, a, xi, yi):
rbf = scipy.interpolate.Rbf(x, y, a)
ai = rbf(xi, yi)
return ai

def rescaled_interp(x, y, a, xi, yi):
a_rescaled = (a - a.min()) / a.ptp()
ai = normal_interp(x, y, a_rescaled, xi, yi)
ai = a.ptp() * ai + a.min()
return ai

因为它是一种 2D 插值方法,所以结果并不完全“像颜色条”。如果需要,您可以只使用一维插值并平铺结果。或者,在这种情况下,简单的三角测量插值方法(例如 griddata )是一个不错的选择,并且应该给出与一维结果相同的结果。 (缺点是在其他情况下它不会“平滑”,但这总是一种权衡。)

关于python - 带插值的 Matplotlib 二维图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17577587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com