2013-09-20 3 views
2

Мне нужно построить график контура и каркаса для функции formula. Это код, который я до сих пор:Графики контуров и каркасных каркасов с Matplotlib

# Number of uniformly ditributed random numbers 
n = 2000 

def func_vec(x1s, x2s): 
    return x1s * x1s + 4 * x2s * x2s 

np.random.seed() 
x1s = np.random.uniform(-1, 1, n) 
x2s = np.random.uniform(-1, 1, n) 
ys = func_vec(x1s, x2s) 

fig = plt.figure() 

# Scatter 
ax1 = fig.add_subplot(1, 2, 1) 
ax1.scatter(x1s, x2s, color = 'g', s = 2, edgecolor = 'none') 
ax1.set_ylim([-1,1]) 
ax1.set_xlim([-1,1]) 

# Contour 
ax1.contour(x2s, x1s, ys[np.newaxis,:].repeat(n, axis = 0)) 

# 3D visualization 
ax2 = fig.add_subplot(1, 2, 2, projection = '3d') 
X = x1s 
Y = x2s 
Z = ys 
ax2.plot_wireframe(X, Y, Z, rstride = 1, cstride = 1) 

plt.show() 

То, что я не понимаю, как contour() и plot_firewrame() на самом деле работает? Может ли кто-нибудь быть таким добрым и объяснить это мне (в контексте указанной функции)? Кроме того, как я должен указывать X, Y и Z?

Это как сюжет выглядит сейчас: enter image description here

и это, как она должна выглядеть (разброс выше работает ОК): enter image description here

+1

Эти функции ожидают структуру при упорядочении точек. Код каркаса рисует линии между 4-связанными соседями, поэтому вы получаете птичье гнездо. – tacaswell

+0

Спасибо, 'griddata()' и 'meshgrid()' выполнили эту работу! – Mati

+1

Можете ли вы опубликовать ответ, объясняющий, что вы сделали? – tacaswell

ответ

2

Вот код, который будет производить правильные участки. Любой, кто борется с этим, должен найти код в значительной степени самоочевидным:

# Number of uniformly ditributed random numbers 
n = 2000 

def func_vec(x1s, x2s): 
    return x1s * x1s + 4 * x2s * x2s 

np.random.seed() 
x1s = np.random.uniform(-1, 1, n) 
x2s = np.random.uniform(-1, 1, n) 
ys = func_vec(x1s, x2s) 

fig = plt.figure(22) 

# Scatter 
ax1 = fig.add_subplot(1, 2, 1) 
ax1.scatter(x1s, x2s, color = 'g', s = 2, edgecolor = 'none') 
ax1.set_ylim([-1,1]) 
ax1.set_xlim([-1,1]) 

# Contour 
xi = np.linspace(-1,1,20) 
yi = np.linspace(-1,1,20) 
zi = griddata((x2s, x1s), ys, (xi[None,:], yi[:,None]), method = 'cubic') 
ax1.contour(xi, yi, zi, 6, linewidths = 1, colors = ('#0000ff', '#0099ff', '#009999', '#999900', '#ff9900', '#ff0000')) 

# 3D visualization 
ax2 = fig.add_subplot(1, 2, 2, projection = '3d') 
X, Y = np.meshgrid(xi, yi) 
ax2.plot_wireframe(X, Y, zi, rstride = 1, cstride = 1) 
ax2.view_init(28, -144) 

plt.show() 
+0

Как я могу получить более сплошные цветовые схемы для контура, чем только цветные линии?? – diffracteD

+0

@diffracteD Используйте 'contourf'. – Mati

+0

Можно ли сделать это назад? Я имею в виду из 3D-набора данных для создания модели, соответствующей поверхности, а затем получить уравнение поверхности. – diffracteD

Смежные вопросы