0

こんにちは、経験豊富な 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 行目以降の不要な数値を削除する方法がわかりません。かなり単純だと思うと思いますが、経験不足のため、この 2 週間はぐるぐる回っています。回答者の皆様、ありがとうございます。

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

2つのこと。まず、データを読み取るときに、必要以上に多くの作業を行っています。ヘッダー行が常に 1 行だけある限り、次のような単純なことを行うだけです。

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

ここで、skip_header=1は最初の行をスキップするように言っています。データの最初の列に nan が含まれることに注意してください。それはいいです; numpy が時間文字列を認識しないと言っているだけです。しかし、プロットにはそれは必要ないと思います。まったく行う必要がないことに注意してください。f = open("filename.csv")やりたい場合は、使いf.close()終わったら必ず使用してください。

次に、プロットするには、データを再形成する必要があります。このplt.contour関数は 3 つの主な引数を取ります。1 番目と 2 番目は x 座標と y 座標を指定し、3 番目は z 値を指定します。N_xおよび座標値がある場合N_y、z はN_x*N_y値を持つ必要があります。

CSV ファイルが特定の順序になっていると想定する必要があります。ここでは、最初に東座標の値を通過し、次に北座標のさまざまな値に対して東座標の値を繰り返すと仮定します。次に、データは次のようになります

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]最初の値を取得します。これにより、すべての異なる x 値が得られます。N_x次に、data[::N_x,5]6 列目からすべての数値を取得しますが、一度に N_x をスキップして、異なる y 値を取得します。最後に、reshapeコマンドは Height データを取得し、プロット用に長方形の配列にします。高さ以外の値が必要な場合は、6 以外の値を使用してください。

次に、次のような方法でデータをプロットするだけです

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

コードの下部セクションにある他のすべてのことは、ランダムなサンプル データを作成するか、プロットに他の機能を追加することです。基本的な作業ができるようになってから、それらを試してみるのがおそらく最善です。

于 2013-05-05T02:58:18.427 に答える