Python曲面图值错误
Python surface plot Value error
我正在习惯 python,现在想制作 3D 曲面图。
我有三个变量 x、y、z 和一个强度函数 I=I(x,y,z)。我想选择一个特定的切片 z=250 并绘制 x 和 y 方向的分布。
问题是,我不知道如何为 z 值选择切片。我试过的所有版本都因错误而结束
这是我的
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()
我收到一个错误:ValueError:形状不匹配:无法将对象广播到单个形状
我该如何正确操作?
编辑:我正在使用 python 3.6 和 jupyter notebook
numpy.meshgrid(x,y,z)
创建三个 3D 数组。 Matplotlib 需要二维数组作为输入。因此,您需要另一组 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()
我正在习惯 python,现在想制作 3D 曲面图。 我有三个变量 x、y、z 和一个强度函数 I=I(x,y,z)。我想选择一个特定的切片 z=250 并绘制 x 和 y 方向的分布。 问题是,我不知道如何为 z 值选择切片。我试过的所有版本都因错误而结束
这是我的
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()
我收到一个错误:ValueError:形状不匹配:无法将对象广播到单个形状
我该如何正确操作? 编辑:我正在使用 python 3.6 和 jupyter notebook
numpy.meshgrid(x,y,z)
创建三个 3D 数组。 Matplotlib 需要二维数组作为输入。因此,您需要另一组 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()