我的评论的后续内容...首先,我将替换所有这些行:
data = np.loadtxt(r'dataa.txt')
a = [data[:,0]]
b = [data[:,1]]
n = [data[:,2]]
x = np.asarray(a)
y = np.asarray(b)
z = np.asarray(n)
With:
x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
您的原始代码是在前面添加一个额外的轴,因为[data[:,0]]
是一个包含一个元素的数组列表。结果是x.shape
将(1, N)
相反,如果(N,)
。所有这些都可以使用上面的最后一行自动完成,或者您可以只使用相同的data
加载并说:
x = data[:,0]
y = data[:,1]
z = data[:,2]
因为这些切片会给你一个数组。
然而,你还没有完全完成,因为plt.contour
希望你给它一个二维数组z
,不是一维值数组。现在,你似乎已经z
给定值x, y
点,但是contour
希望你给它一个二维数组,比如图像。
在我回答这个问题之前,我需要知道如何x
and y
是有间隔的。如果定期的话,你可以很容易地填充一个数组。如果不定期,您基本上必须在绘制等高线图之前进行插值。
要进行插值,请使用
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
N = 1000 #number of points for plotting/interpolation
x, y, z = np.genfromtxt(r'dataa.txt', unpack=True)
xi = np.linspace(x.min(), x.max(), N)
yi = np.linspace(y.min(), y.max(), N)
zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')
fig = plt.figure()
plt.contour(xi, yi, zi)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()