0

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

Time,F,Ef,FP,Easting,Northing,Height 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()
4

1 回答 1

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)

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

然后,您只需使用类似的东西绘制数据

plt.contour(x,y,z)
plt.show()

代码中较低部分中的其他所有内容要么是构建一些随机样本数据,要么是在图中添加其他花里胡哨的东西。最好只有在你得到一些基本的工作之后再玩这些。

于 2013-05-05T02:58:18.427 回答