获取等高线图以使用CSV文件中的数据

时间:2013-05-04 07:25:24

标签: python contour

经验丰富的python社区。 我经常收集磁数据作为我工作的一部分,但我必须等到我从现场回来处理数据以检查其质量。此数据采用以下格式: -

时间,F,EF,FP,东,北,身高 21:51:02,53169.31,-14.3,-17.79,386330.362,7371876.155,540.939

这可以以不同的格式输出,例如txt,xls或者在这种情况下是csv。我的目标是能够在笔记本电脑上快速绘图并检查数据是否有污染。 使用Google引导我进行stackoverflow并查看各种帖子,我已经提出了下面的脚本。感谢所有这些帖子。 我的问题是我可以读取csv文件,但我无法理解如何将这些数据输入绘图部分并从第27行开始删除不需要的数字。我相信你会发现它相当简单,但由于我缺乏经验,我过去两周一直在圈子里。感谢所有回复的人。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

f = open("filename.csv")
data = np.genfromtxt('filename.csv', dtype=[('Time',float),('F',float),('Ef',float),
                                   ('FP',float),('E',float),('N',float),('H',float)],
                                   comments='"', delimiter=',')

#only here so that I can see the file is being 
#read so will probably remove it later
for line in f:
    print line

#below is copied from elsewhere in stackoverflow and trying to adapt
#to my needs so at the moment I get this a Duplicate Point Warning. 
#So I need to call the above into what is below. 
ndata = 100
ny, nx = 100, 200
xmin, xmax = 1, 50
ymin, ymax = 1, 50

x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)

xi = np.linspace(xmin, xmax, nx) #
yi = np.linspace(ymin, ymax, ny) #
zi = ml.griddata(x, y, z, xi, yi) #

plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))

plt.colorbar() 
plt.scatter(x, y, marker = 'o', c = 'b', s = 5, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()

1 个答案:

答案 0 :(得分:3)

两件事。首先,在阅读数据时,你所做的工作比必要的要多得多。只要你总是只有一个标题行,你就应该做一些简单的事情,比如

data = np.genfromtxt('filename.csv', skip_header=1, delimiter=',')

在这里,skip_header=1只是说要跳过第一行。请注意,您的数据将在第一列中包含nan。没关系;它只是说numpy不能识别你的时间字符串。但我认为你不需要绘图。请注意,您根本不需要f = open("filename.csv"),如果您愿意,请务必在完成后使用f.close()

其次,要进行绘图,您需要重塑数据。 plt.contour函数有三个主要参数。第一个和第二个指定x和y坐标,第三个指定z值。如果有N_xN_y坐标值,则z必须包含N_x * N_y个值。

我必须假设你的CSV文件有某种特定的顺序。在这里,我假设它首先通过Easting的值,然后为不同的Northing值重复Easting的值。然后你的数据就像

x = data[:N_x,4]
y = data[::N_x,5]
z = data[:,6].reshape(N_y,N_x)

此处,data[:N_x,4]获取第5列中的第一个N_x值(当您从0开始时为4),这将为您提供所有不同的x值。然后,data[::N_x,5]获取第6列中的所有数字,但一次跳过N_x,以便获得不同的y值。最后,reshape命令获取您的高度数据,并将其转换为矩形数组以进行绘图。如果您想要除高度之外的其他内容,请使用6以外的值。

然后,您只需使用类似

的数据绘制数据
plt.contour(x,y,z)
plt.show()

代码中较低部分中的其他所有内容都是构建一些随机样本数据,或者为绘图添加其他铃声和口哨声。只有在你得到基本的工作之后,最好还是与它们一起玩。