Skip to main content
 首页 » 编程设计

python之matplotlib 中的 "Inputs x and y must be 1D or 2D"错误

2025年05月04日9mate10pro

我正在尝试从一个大文件中绘制一些数据。 数据具有以下形式:

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  

原则上,每条线对应一个三维点,我想“简单地”绘制从这些点生成的 3d 表面,类似于我可以用 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() 

这段代码实际上可以很好地处理向量 x、y 和 z,这些向量在上面的代码中用井号标签进行了注释。

但是知道我正在尝试上面给出的数据,我在 matplotlib 中收到“输入 x 和 y 必须是一维或二维”错误。

我读到这可能与 Z 的形状与 X 或 Y 的形状不同有关...但我不确定如何处理这个问题。

顺便说一句,正如您可能意识到的那样,我是 Python 的 super 新手,如果代码对你们中的一些人来说非常丑陋,我深表歉意。

无论如何,我们非常欢迎任何帮助。

谢谢!

法比安

请您参考如下方法:

使用 scipy.interpolate.griddata :

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() 

产量


相关链接: