我有一个复杂的函数,想用Matplotlib绘制一个3D图形。下面是我的代码:
import numpy as np
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
plt.style.use('seaborn-poster')
fig = plt.figure(figsize = (10,10))
ax = plt.axes(projection='3d')
x = np.arange(-23, 23, 0.1)
y = np.arange(-23, 23, 0.1)
x1=25
y1=22
x2=15
y2=17
x3=25
y3=12
A1=np.exp(np.deg2rad(0.0) * 1j)
A2=np.exp(np.deg2rad(10.) * 1j)
A3=np.exp(np.deg2rad(20.) * 1j)
z=(((2*A1*(y1-y))/((x1-x)**2+(y1-y)**2))+((2*A2*(y2-y))/((x2-x)**2+(y2-y)**2))+((2*A3*(y3-y))/((x3-x)**2+(y3-y)**2)))
z_abs=np.abs(z)
X, Y = np.meshgrid(x, y)
Z = z_abs(X, Y)
surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
# Set axes label
ax.set_xlabel('x', labelpad=20)
ax.set_ylabel('y', labelpad=20)
ax.set_zlabel('z', labelpad=20)
fig.colorbar(surf, shrink=0.5, aspect=8)
plt.show()
但是当运行代码时,我得到了这个错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[5], line 22
19 z_abs=np.abs(z)
21 X, Y = np.meshgrid(x, y)
---> 22 Z = z_abs(X, Y)
24 surf = ax.plot_surface(X, Y, Z, cmap = plt.cm.cividis)
25 # Set axes label
TypeError: 'numpy.ndarray' object is not callable
我认为函数的虚部是问题所在。
2条答案
按热度按时间bjg7j2ky1#
@jared正确识别了问题:你的
z_abs
已经是一个Numpy数组,不能被调用(它不是一个函数)。你可以像下面的例子一样定义你的复杂函数:上面的照片真的不太好。当然,你可以在某个位置看到一根柱子,但没有别的。如果我是你,我会画出你的复变函数的绝对值
log10
:bqjvbblv2#
正如错误所说,
z_abs
是一个numpy数组。您试图通过执行z_abs(X, Y)
来调用该数组,这是不可能的。相反,您可能希望像创建z
那样创建Z
,但使用X
和Y
,而不是x
和y
。然后可以取该结果的绝对值进行绘图。这就是我做了这些改变后得到的: