经验丰富的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()
答案 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_x
和N_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()
代码中较低部分中的其他所有内容都是构建一些随机样本数据,或者为绘图添加其他铃声和口哨声。只有在你得到基本的工作之后,最好还是与它们一起玩。