作为Python和Stackoverflow新手,请原谅我的愚蠢问题。很长一段时间我一直在努力,没有取得进展。我正在尝试为各个轴设置一个带有X Y Z向量的3D图。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import numpy as np
import pandas, io
data = np.array([[0 ,0 ,1918],
[1000 ,0 ,2001],
[2000 ,0 ,2031],
[3000 ,0 ,2048],
[0 ,1000 ,2001],
[1000 ,1000 ,2084],
[2000 ,1000 ,2114],
[3000 ,1000 ,2131],
[0 ,2000 ,2031],
[1000 ,2000 ,2114],
[2000 ,2000 ,2144],
[3000 ,2000 ,2161],
[0 ,3000 ,2048],
[1000 ,3000 ,2131],
[2000 ,3000 ,2161],
[3000 ,3000 ,2178]])
df = pandas.DataFrame(data,columns=["X","Y","Z"])
print(df)
x, y = np.meshgrid(df['X'],df['Y'])
plt.clf()
fig = plt.figure()
ax = fig.gca(projection='3d')
myplot = ax.plot_surface(X=x,Y=y,Z=df['Z'])
plt.show(myplot)
样本数据有16个数据点。据我所知,我必须将X和Y向量转换为4x4网格,该网格定义空间中的每个Z值。这是我尝试用np.meshgrid实现的。结果应该是一个均匀的区域,从(0,0)到(3000,3000)具有恒定的斜率。但是,这不是我所看到的:
我很感激所有人都把我推向了正确的方向。
答案 0 :(得分:1)
您可能误解了meshgrid
。 E.g。
p,q = np.meshgrid(["a","b"],["X","Y"])
print(p)
print (q)
# results in
[['a' 'b']
['a' 'b']]
[['X' 'X']
['Y' 'Y']]
两个长度为n
和m
的数组的网格网格将生成两个形状为(m,n)
的数组。如果将完整的坐标列表放入meshgrid,它将产生16乘16的矩阵,而不是所需的4乘4矩阵。
这里你已经拥有了所有坐标,它们不是2D形状。因此,我们的想法是使用numpy.reshape
简单地重塑坐标列表。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
data = np.array([[0 ,0 ,1918],
[1000 ,0 ,2001],
[2000 ,0 ,2031],
[3000 ,0 ,2048],
[0 ,1000 ,2001],
[1000 ,1000 ,2084],
[2000 ,1000 ,2114],
[3000 ,1000 ,2131],
[0 ,2000 ,2031],
[1000 ,2000 ,2114],
[2000 ,2000 ,2144],
[3000 ,2000 ,2161],
[0 ,3000 ,2048],
[1000 ,3000 ,2131],
[2000 ,3000 ,2161],
[3000 ,3000 ,2178]])
x = data[:,0].reshape(4,4)
y = data[:,1].reshape(4,4)
z = data[:,2].reshape(4,4)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X=x,Y=y,Z=z)
plt.show()
答案 1 :(得分:0)
你的代码看起来没问题,尽管使用pandas是多余的。看起来你正在使用的数据根本不是你所追求的数据,即恒定斜率。
这是我的代码
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import numpy as np
import io
data = np.array([[0 ,0 ,1918],
[1000 ,0 ,2001],
[2000 ,0 ,2031],
[3000 ,0 ,2048],
[0 ,1000 ,2001],
[1000 ,1000 ,2084],
[2000 ,1000 ,2114],
[3000 ,1000 ,2131],
[0 ,2000 ,2031],
[1000 ,2000 ,2114],
[2000 ,2000 ,2144],
[3000 ,2000 ,2161],
[0 ,3000 ,2048],
[1000 ,3000 ,2131],
[2000 ,3000 ,2161],
[3000 ,3000 ,2178]])
X, Y = np.meshgrid(data[:, 0], data[:, 1])
Z = X + Y
plt.clf()
fig = plt.figure()
ax = fig.gca(projection='3d')
myplot = ax.plot_surface(X,Y,Z)
plt.show(myplot)
产生平面的表面。
请注意,存在一个主要区别:在您的情况下,Z是一维向量,而我使用的是X + Y
矩阵。
您使用的数据基本上是一个点云,因此如果您想从中生成一个表面,您必须更加具体地了解如何生成它。