2015-11-14 4 views
1

У меня есть набор заданных множеств точек (x, y, F (x, y)), и я хотел бы построить график контура с (x, y), показанным в виде точек и контуры, вычисленные как кривые уровня F (x, y). Кто-нибудь знает, как это сделать с морским дном?Контуры участка заданного набора точек

Я бы хотел, чтобы что-то вроде sepal_width vs. sepal_length как http://goo.gl/SWThWS (без маргиналов), за исключением того, что оценка плотности ядра должна вычисляться не с использованием пространственной плотности точек, а вместо F (x, y) ,

+0

ли вы кривые уровень рассчитаны или только точек? –

+0

Только точки, как рассчитать кривые уровня? –

+0

Как распределяются ваши очки? Являются ли они равномерно распределенными по x, y? –

ответ

0

Вы можете интерполировать данные на 2D-сетку. Есть lots of ways to do this - вероятно, близкая аналогия ядра оценки плотности будет интерполировать использование radial basis function:

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

def f(x, y): 
    return np.sin(x) + np.cos(2 * y) 

# 1D arrays of points 
x = np.random.rand(100) * 2 * np.pi 
y = np.random.rand(100) * 2 * np.pi 
z = f(x, y) 

# initialize radial basis function 
rb = Rbf(x, y, z) 

# interpolate onto a 100x100 regular grid 
X, Y = np.mgrid[:2*np.pi:100j, :2*np.pi:100j] 
Z = rb(X.ravel(), Y.ravel()).reshape(X.shape) 

# plotting 
fig, ax = plt.subplots(1, 1) 
ax.set_aspect('equal') 
ax.hold(True) 
m = ax.contourf(X, Y, Z, 20, cmap=plt.cm.Greens) 
ax.scatter(x, y, c=z, s=60, cmap=m.cmap, vmin=m.vmin, vmax=m.vmax) 
cb = fig.colorbar(m) 
cb.set_label('$f(x, y)$', fontsize='xx-large') 
ax.set_xlabel('$x$', fontsize='xx-large') 
ax.set_ylabel('$y$', fontsize='xx-large') 
ax.margins(0.05) 
fig.tight_layout() 
plt.show() 

enter image description here

+0

Это то, что я сделал в конце. Для морского берега сплошной график взаимодействия выглядит действительно красивым http://goo.gl/1i5koJ. –