2017-12-01 13 views
0

私はPythonに慣れていて、3Dサーフェスプロットをしたいと思っています。 私は3つの変数x、y、zとIntensity関数I = I(x、y、z)を持っています。私は、特定のスライスz = 250を選び、x方向とy方向についてdsitributionをプロットしたいと思います。 問題は、私はz値のスライスを選ぶ方法を知らないということです。 ValueError:形状の不一致:オブジェクトはPythonサーフェスプロット値エラー

単一形状に放送することができない私はどのように行うのですか、私が試したすべてのバージョンは、ここではいくつかのエラー

iは

import pandas as pd 
import numpy as np #NumPy 
import scipy as sp #SciPy 
import matplotlib as mpl #Matplotlib(2D/3D) 
import matplotlib.pyplot as plt #Matplotlib's pyplot 
from pylab import * #Matplotlib's pylab 
from mpl_toolkits.mplot3d import Axes3D 
%matplotlib inline 


x = linspace(-4,4,50)  # units mm 
y = linspace(-4,4,50)  # units mm 


# define beam parameters 
I_0 = 1e0    # intensity 
lambda_1 = 800e-9  # wavelength 
w_0 = 1.5    # beam waist 
z_r = pi*w_0**2*1e-6/lambda_1 # Rayleigh length in units mm 

z = linspace(-4,4,500)*z_r 
# calculate intensity profile 

X,Y,Z = meshgrid(x,y,z) 

w = w_0 *sqrt(1+(Z/z_r)**2) 

I = I_0*((w_0/w)**2)*exp(-2*(X**2+Y**2)/(w**2)) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

surf = ax.plot_surface(X, Y, I[:,:,250], cmap=cm.coolwarm,linewidth=0,antialiased=False) 

show() 

を持っているものであるIIN私はエラーを取得終了しましたそれは正しくですか? 編集:jupiterノートブックでpython 3.6を使用しています

+0

あなたは私の形状を確認することができますか? – Dschoni

+0

'meshgrid(x、y、z)'は3つの3D配列を作成します。 Matplotlibは入力として2D配列を必要とします。 – ImportanceOfBeingErnest

+0

'X'と' Y'も3D配列です。 – Jurgy

答えて

0

numpy.meshgrid(x,y,z)は3つの3D配列を作成します。 Matplotlibは入力として2D配列を必要とします。したがって、プロットするために別のxとyの配列が必要になります。それらはnumpy.meshgrid(x,y)で作成することも、既存の配列をスライスすることもできます。

surf = ax.plot_surface(X[:,:,0], Y[:,:,0], I[:,:,250], ...) 

コンプリート例:

import numpy as np #NumPy 
import matplotlib.pyplot as plt #Matplotlib's pyplot 
from mpl_toolkits.mplot3d import Axes3D 
#%matplotlib inline 

x = np.linspace(-4,4,50)  # units mm 
y = np.linspace(-4,4,50)  # units mm 

# define beam parameters 
I_0 = 1e0    # intensity 
lambda_1 = 800e-9  # wavelength 
w_0 = 1.5    # beam waist 
z_r = np.pi*w_0**2*1e-6/lambda_1 # Rayleigh length in units mm 

z = np.linspace(-4,4,500)*z_r 


X,Y,Z = np.meshgrid(x,y,z) 

w = w_0 *np.sqrt(1+(Z/z_r)**2) 
# calculate intensity profile 
I = I_0*((w_0/w)**2)*np.exp(-2*(X**2+Y**2)/(w**2)) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

surf = ax.plot_surface(X[:,:,0], Y[:,:,0], I[:,:,250], 
         cmap=plt.cm.coolwarm,linewidth=0,antialiased=False) 

plt.show() 

enter image description here

+0

ねえ男! 助けてくれてありがとう。私はmondayの仕事であなたのソリューションを試してみるでしょうが、それはすでに私が望んでいたのとまったく同じように見えます。 – Simon

+0

ねえ、コードは正常に動作します。 しかし、私はまだ問題があります。このhttps://stackoverflow.com/questions/35445424/surface-and-3d-contour-in-matplotlibスレッドでは、表面に黒い線がワイヤフレームとして表示されます。 どうすれば入手できますか?私のジュピターのノートブックは、私がスレッドで全く同じコードを実行しても表示されません – Simon

関連する問題