我想在X,Y和Z轴上为这100个点制作3D图。我已经为所有3个轴生成了所需的列表。我认为这应该足以在3D中绘制一组点。但是我不明白输出。我很欣赏这方面的任何帮助。
################################################################
# problem : f(x) = (e**(-(y**2)))*cos(3*x)+(e**(x**2))*cos(3*y)
################################################################
from mpl_toolkits.mplot3d import Axes3D
import math
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax=Axes3D(fig)
x = np.arange(-5,5,1)
y = np.arange(-5,5,1)
X = []
Y = []
Z=[]
for i in range(len(x)):
for j in range(len(y)):
z=(np.exp(-(y[j]**2))*np.cos(3*x[i]))+(np.exp(x[i]**2)*np.cos(3*y[j]))
Z.append(z)
X.append(x[i])
Y.append(y[j])
ax.plot(X,Y,Z,'o')
plt.show()
编辑/更新:我不确定我的问题是代码本身还是我理解3Dplots的方式,我应该使用meshgrids来获得我期望的情节吗?
答案 0 :(得分:4)
你有哪个版本的matplotlib? documentation表示对于matplotlib版本1.0.0及更高版本,您应该按如下方式创建3D轴:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
而不是之前版本中使用的ax = Axes3D(fig)
。
编辑在OP评论之后,似乎是代码的结果不符合预期,而不是出现某种错误。以下代码是我认为的意图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x, y = np.meshgrid(np.linspace(-5., 5., 100), np.linspace(-5., 5., 100))
def zfunc(x, y):
return np.exp(-(y**2)) * np.cos(3.*x) + np.exp(x**2) * np.cos(3.*y)
z = zfunc(x, y)
ax.plot_surface(x, y, z)
plt.show()
在上面的代码中,创建了一个二维网格(从原始帖子中丢失),并且该函数被计算为这两个变量的函数并绘制为表面。以前只有x=y
的一系列点正在策划。