2014-10-07 59 views
0

我想繪製Matplotlib中由零到處組成的曲面,除了以(0,0)爲中心的矩形區域,邊(Dx,Dy)由1組成的 - 一種像桌子一樣,如果你願意;我可以使用plot_surface命令來做到這一點,不用擔心。我還想在「x」和「y」方向上繪製它的投影(如this demo),結果變得很奇怪:Python似乎是插值我的幅度值(同樣應該是零或一)用於輪廓圖並顯示一些線條,其值與我的數據點不相符。用plot_surface繪製錯誤值的Python輪廓

這是我在做什麼:

import numpy 
from matplotlib import pylab 
from mpl_toolkits.mplot3d import axes3d 

Dx = 1. # Define the sides of the rectangle 
Dy = 2. 

x_2D = numpy.linspace(-Dx, Dx, 100)  # Create the mesh points 
y_2D = numpy.linspace(-Dy, Dy, 100) 
x_mesh, y_mesh = numpy.meshgrid(x_2D, y_2D) 

rect_2D = numpy.zeros(x_mesh.shape) # All values of "rect_2D" are zero... 
for i in range(x_2D.size): 
    for j in range(y_2D.size): 
     if numpy.abs(x_mesh[i, j]) <= Dx/2 and numpy.abs(y_mesh[i, j]) <= Dy/2: 
      rect_2D[i, j] = 1.   # ... except these ones 

fig = pylab.figure(figsize=(9, 7)) 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(x_mesh, y_mesh, rect_2D, alpha=0.3) 

ax.contour(x_mesh, y_mesh, rect_2D, zdir='x', offset=-1.5, cmap=pylab.cm.brg) 
ax.contour(x_mesh, y_mesh, rect_2D, zdir='y', offset=3, cmap=pylab.cm.brg) 

ax.set_xlim(-1.5, 1.5) 
ax.set_ylim(-3, 3) 
ax.set_zlim(0., 1.5) 

ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

得出的數據與幅度深綠色線略低於0.8雙方的「X」和「Y」的預測,不存在中我的「rect_2D」變量。有誰知道這是一個錯誤還是我的代碼中有錯誤?有關如何擺脫它的任何建議?提前致謝!

+0

您可能想知道,一個numpy代碼可以運行矢量化,並且比**嵌套循環**執行速度快得多。從36300+ [usec]下降到340 [usec] **使處理恕我直言的速度超過100倍值得一提。** Vectorised numpy語法看起來就是這樣:**'rect_2D [:,:] = 1 *((numpy .abs(x_mesh)<= DxHalf)*(numpy.abs(y_mesh)<= DyHalf))** ** – user3666197 2014-10-07 18:54:18

+0

感謝user3666197,這的確值得一提!我記得每次都嘗試使用向量化的代碼,但是舊的習慣很難實現! – 2014-10-08 15:00:08

回答

0

添加levels = [0], kwarg到您的ax.contour呼叫。這指定沿着軸線計算輪廓的位置。有關更多信息,請參閱mpl.axes.Axes.contour docstring。

問題在於,如果沒有指定levels,輪廓會自動計算輪廓的位置,並且這些輪廓中的一個剛選擇過「表格邊緣」,但在Zdata爲0之前選擇。在這些點之間, 0和1.

+0

嗨弗雷斯諾斯,那真是太棒了!我的確想象Matplotlib會有一些方法來定義繪製哪些輪廓,但如果沒有給出,我不會指望它插入數據。謝謝! – 2014-10-08 15:07:15