Python: двухмерный контурный график из 3 списков: x, y и rho? - PullRequest
28 голосов
/ 25 января 2012

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

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

Спасибовас очень много.

РЕДАКТИРОВАТЬ: я работаю с большими массивами: х, у и ро имеют от 10000 до 1000000 элементов

Ответы [ 2 ]

44 голосов
/ 25 января 2012

Вам необходимо интерполировать ваши 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

13 голосов
/ 01 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...