Matplotlib 3D Plot无法正常工作

时间:2017-11-16 20:57:52

标签: python python-3.x pandas matplotlib

作为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)具有恒定的斜率。但是,这不是我所看到的:

Resulting Graph

我很感激所有人都把我推向了正确的方向。

2 个答案:

答案 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']]

两个长度为nm的数组的网格网格将生成两个形状为(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()

enter image description here

答案 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矩阵。

您使用的数据基本上是一个点云,因此如果您想从中生成一个表面,您必须更加具体地了解如何生成它。