Подтвердить что ты не робот

Python: 2d контурный график из 3 списков: x, y и rho?

У меня есть простая проблема в python и matplotlib. У меня есть 3 списка: x, y и rho с rho [i] плотность в точке x [i], y [i]. Все значения x и y находятся между -1. и 1. но они не в определенном порядке.

Как сделать контурный график (например, с imshow) плотности rho (интерполированный в точках x, y).

Большое спасибо.

EDIT: я работаю с большими массивами: x, y и rho имеют от 10 000 до 1 000 000 элементов

4b9b3361

Ответ 1

Вам нужно интерполировать значения 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()

enter image description here

Ответ 2

Вы можете использовать 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 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, но должна работать лучше для больших # точек: Интерполяция с обратным расстоянием (IDW) Интерполяция с Python