Python导入txt表文件中的轮廓图

时间:2013-12-08 18:06:52

标签: python matplotlib

我正在尝试制作一个等高线图:

contour

使用txt文件中的3列数据表,行数很长。

使用此代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

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)

print "x = ", x
print "y = ", y
print "z = ", z

fig=plt.figure()

CF = contour(x,y,z,colors = 'k')

plt.xlabel("X")
plt.ylabel("Y")
plt.colorbar()
plt.show()

我不知道为什么,它不起作用。 Python为我提供了我希望看到的值的正确轴,但在图中只是一个空白,我知道它正在以正确的方式导入数据,因为它在绘图之前显示了我的值。

表的示例:(差异是因为我的表有90000行) enter image description here

使用此代码:

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

我得到了这个结果: enter image description here 我想我的建议是错误的。

2 个答案:

答案 0 :(得分:4)

从我的评论中跟进...首先,我会替换所有这些行:

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)

使用:

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期望您给它一个二维数组,就像一个图像。

在我回答之前,我需要知道xy的间距。如果经常,您可以很容易地填充数组。如果不经常,你基本上必须进行插值才能制作轮廓图。

要进行插值,请使用

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

答案 1 :(得分:2)

以下代码对我有用:

import scipy.interpolate    
import numpy as np  

N = 500 #number of points for plotting/interpolation    
x, y, z = np.genfromtxt(r'data.dat', unpack=True)
xll = x.min();  xul = x.max();  yll = y.min();  yul = y.max()

xi = np.linspace(xll, xul, N)
yi = np.linspace(yll, yul, N)
zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic')

contours = plt.contour(xi, yi, zi, 6, colors='black')
plt.clabel(contours, inline=True, fontsize=7)
plt.imshow(zi, extent=[xll, xul, yll, yul], origin='lower', cmap=plt.cm.jet, alpha=0.9)
plt.xlabel(r'$x$')
plt.ylabel(r'$y$')
plt.clim(0, 1)
plt.colorbar()
plt.show()