Python:从三个列表生成二维轮廓图:x、y和rho?
我在使用Python和matplotlib时遇到了一个简单的问题。
我有三个列表:x、y和rho,其中rho[i]表示在点x[i]和y[i]处的密度。
x和y的所有值都在-1到1之间,但它们的顺序并不固定。
我想知道如何制作一个密度rho的轮廓图(像使用imshow那样),这个轮廓图需要在x和y的点上进行插值。
非常感谢。
补充说明:我处理的是大数组:x、y和rho的元素数量在10,000到1,000,000之间。
2 个回答
14
你可以使用scipy的griddata
(需要Scipy版本大于等于0.10),这是一种基于三角剖分的方法。
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
# Generate data: for N=1e6, the triangulation hogs 1 GB of memory
N = 1000000
x, y = 10 * np.random.random((2, N))
rho = np.sin(3*x) + np.cos(7*y)**3
# Set up a regular grid of interpolation points
xi, yi = np.linspace(x.min(), x.max(), 300), np.linspace(y.min(), y.max(), 300)
xi, yi = np.meshgrid(xi, yi)
# Interpolate; there's also method='cubic' for 2-D data such as here
zi = scipy.interpolate.griddata((x, y), rho, (xi, yi), method='linear')
plt.imshow(zi, vmin=rho.min(), vmax=rho.max(), origin='lower',
extent=[x.min(), x.max(), y.min(), y.max()])
plt.colorbar()
plt.show()
还有一种叫做反距离加权插值的方法——它和RBF类似,但在处理大量数据点时效果应该更好:使用Python进行反距离加权(IDW)插值
53
你需要对你的 rho
值进行插值。插值的方法有很多种,选择哪种“最好”的方法完全取决于你想要在插值中考虑的先验信息。
在我开始抱怨那些“黑箱”插值方法之前,想说的是,径向基函数(比如“薄板样条”就是一种特定类型的径向基函数)通常是个不错的选择。如果你的数据点有几百万个,这种方法可能会效率不高,但作为一个起点,你可以试试:
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
# Generate data:
x, y, z = 10 * np.random.random((3,10))
# Set up a regular grid of interpolation points
xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100)
xi, yi = np.meshgrid(xi, yi)
# Interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
zi = rbf(xi, yi)
plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower',
extent=[x.min(), x.max(), y.min(), y.max()])
plt.scatter(x, y, c=z)
plt.colorbar()
plt.show()