Python &引用;输入x和y必须为1D或2D“;matplotlib中的错误
我正试图从一个大文件中绘制一些数据。 数据的格式如下:Python &引用;输入x和y必须为1D或2D“;matplotlib中的错误,python,matplotlib,Python,Matplotlib,我正试图从一个大文件中绘制一些数据。 数据的格式如下: 0.025876 139 0 0.030881 140 0 0.030982 141 0 0.035602 142 0 0.035521 143 0 0.038479 144 0 0.040668 145 0 0.040121 146 0 0.037953 147 0 0.039027 148 0 0.038338 149 0 0.047557 139 1 0.045105 140 1 0.044943 141 1 0.042370 142
0.025876 139 0
0.030881 140 0
0.030982 141 0
0.035602 142 0
0.035521 143 0
0.038479 144 0
0.040668 145 0
0.040121 146 0
0.037953 147 0
0.039027 148 0
0.038338 149 0
0.047557 139 1
0.045105 140 1
0.044943 141 1
0.042370 142 1
0.042025 143 1
0.038946 144 1
0.037953 145 1
0.033373 146 1
0.030070 147 1
0.029118 148 1
0.025552 149 1
原则上,每一条线对应一个三维点,我想“简单地”绘制一个由这些点生成的三维曲面,类似于我在gnuplot中使用splot函数可以为了解它的人所做的
为了在网上找到问题的答案,我使用matplolib轮廓函数尝试了以下方法:
#!/usr/bin/python
from numpy import *
import pylab as p
import sys
import mpl_toolkits.mplot3d.axes3d as p3
s = str(sys.argv[1])
f = open(s)
z,y,x = loadtxt(f, unpack = True)
f.close
#x = [1,2,3]
#y = [1,2,3]
#z = [1,8,16]
data = zip(x,y,z)
#map data on the plane
X, Y = meshgrid(arange(0, 89, 1), arange(0, 300, 1))
Z = zeros((len(X),len(Y)),'Float32')
for x_,y_,z_ in data:
Z[x_, y_] = z_ #this should work, but only because x and y are integers
#and arange was done with a step of 1, starting from 0
fig=p.figure()
ax = p3.Axes3D(fig)
ax.contourf(X,Y,Z)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
p.show()
这段代码实际上可以很好地处理上面代码中用hashtag注释的向量x、y和z
但要知道,我正在尝试使用上面给出的数据,我在matplotlib中得到“输入x和y必须是1D或2D”错误
我已经读到,这可能与Z与X或Y的形状不同有关……但我不确定如何处理这个问题
顺便说一句,正如您可能意识到的,我是Python的超级新手,如果代码对您中的一些人来说非常难看,我向您道歉
无论如何,任何帮助都是非常受欢迎的
谢谢
法比安使用:
屈服
相关链接:
零(X.shape),'Float32')
。很抱歉……我不确定X.shape位放在哪里。我写Z=0(X.shape,'Float32')吗?非常感谢!有没有办法直接从文件导入内容?就像我在我的第一个代码中尝试做的那样?我曾尝试使用“content=np.loadtxt(f)”,其中f指向一个数据文件,但格式似乎不正确……是的,使用data=np.genfromtxt(filename,…)
。我已经编辑了上面的代码来说明我的意思np.genfromtxt
可以采用类似文件的对象(例如,io.BytesIO(…)
)或解释为数据文件路径的字符串。这里有一个链接,解释了更多关于。
import io
import sys
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
import scipy.interpolate as interpolate
content = '''0.025876 139 0
0.030881 140 0
0.030982 141 0
0.035602 142 0
0.035521 143 0
0.038479 144 0
0.040668 145 0
0.040121 146 0
0.037953 147 0
0.039027 148 0
0.038338 149 0
0.047557 139 1
0.045105 140 1
0.044943 141 1
0.042370 142 1
0.042025 143 1
0.038946 144 1
0.037953 145 1
0.033373 146 1
0.030070 147 1
0.029118 148 1
0.025552 149 1'''
data = np.genfromtxt(io.BytesIO(content), dtype=None, names='x, y, z')
# Or, to read from a file:
# data = np.genfromtxt(filename, dtype=None, names='x, y, z')
x, y, z = data['x'], data['y'], data['z']
N = 20
xi = np.linspace(x.min(), x.max(), N)
yi = np.linspace(y.min(), y.max(), N)
X, Y = np.meshgrid(xi, yi)
Z = interpolate.griddata((x, y), z, (X, Y), method='nearest')
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.scatter(data['x'], data['y'], data['z'])
ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1)
# ax.plot_surface(X, Y, Z)
plt.show()