Python:来自3个列表的2d等高线图:x,y和rho?

Vin*_*ent 28 python matplotlib contour

我在python和matplotlib中有一个简单的问题.我有3个列表: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个元素

Joe*_*ton 44

您需要插入您的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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @diffracteD - 我猜,但它可能是你绘制输出的方式.默认情况下,"imshow"将强制绘图的宽高比为1.换句话说,x方向上的一个厘米与y方向上的一个厘米的单位数相同.这将强制轴与您的数据范围非常长和窄.你可能正在获得合理的输出,但是绘制它以便很难看到.尝试将`aspect ="auto"`传递给`imshow`. (2认同)

pv.*_*pv. 13

你可以使用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()
Run Code Online (Sandbox Code Playgroud)

还有反距离加权插值 - 类似于RBF,但是对于大的点数应该更好:使用Python进行反距离加权(IDW)插值