我想使用3d功能在python3中绘制z = (x + y + 1)/3
。x
和y
的域是整数,范围在[0,29]中超过30个整数点。我现在面临两个问题。
x
,y
和z
的尺寸必须相同...实际上,x
和y
需要30点,而z
需要30 * 30 = 900点。为了绘制图形,我还需要将x
和y
的数据点数量也增加到900。成功绘制时如何使它们保持30个?
如何实现映射(x,y,z)?我不确定当前我的实现是否成功显示了结果。这是因为我不太了解一对z
如何映射(x,y)
。我的实现正确吗?
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def my_mean(l):
k = len(l)
s = 0.0
for elem in l:
s = s + elem
return s / k
if __name__ == "__main__" :
N = 30
x = np.linspace(1, 30, N*N) # I want to make this length 30
y = np.linspace(1, 30, N*N) # this as well...
constants = [1] * N*N
z = []
for i in range(0, N):
for j in range(0, N):
vec = {x[i], y[j], constants[i + N*j]}
z.append(my_mean(vec)) # is this correct??
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(x, y, z, label ="Mean")
ax.set_title("Scatter Plot of Mean")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.legend()
plt.show()
看看NumPy的meshgrid
函数。对于两个向量meshgrid
和x
。它创建二维坐标数组,然后可将其用于矢量化计算。
[回答您的问题:是的,实际上,您的实际y
和x
(也)必须是y
数组,但是如上所述,30 x 30
将使用初始向量为您正确生成这些数组长度为meshgrid
。
这是我的(缩短的)代码:
30
输出:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
N = 30
x = np.linspace(1, 30, N)
y = np.linspace(1, 30, N)
xx, yy = np.meshgrid(x, y)
z = (xx + yy + 1) / 3
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(xx, yy, z, label="Mean")
ax.set_title("Scatter Plot of Mean")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.legend()
plt.show()
希望有帮助!