2013-05-04 1 views
0

안녕하세요 python 커뮤니티. 저는 종종 자기 일의 일부로 자기 데이터를 수집하지만, 데이터를 처리하기 위해 현장에서 돌아올 때까지 기다려야 만합니다. 이 데이터는이 형식으로 제공 : -CSV 파일의 데이터를 사용하도록 등고선 그리기 받기

시간, F, Ef는, FP, Y 좌표, X 좌표, 높이 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() 

답변

3

두 가지. 첫째, 데이터를 읽을 때 필요한 것보다 훨씬 많은 작업을 수행하고 있습니다. 만큼 당신이 항상 정확히 하나 개의 헤더 행을 가지고, 당신은 단지 여기

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

같은 간단한 일을해야의 skip_header=1는 첫 줄을 건너 뛸 말한다. 귀하의 데이터는 첫 번째 열에 나노를 갖게됩니다. 괜찮아; 그냥 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] 당신에게 모든 다른 X 값을 제공해야하는, (당신은 0으로 시작하면 번호 4 인) 5 열에서 첫 N_x 값을 사용합니다. 그런 다음 data[::N_x,5]은 여섯 번째 열의 모든 숫자를 사용하지만 N_x는 한 번에 건너 뜁니다. 그러면 다른 y 값을 얻을 수 있습니다. 마지막으로 reshape 명령은 높이 데이터를 가져 와서 플로팅을위한 직사각형 배열로 만듭니다. 당신은 높이가 아닌 다른 무언가를 원하는 경우 중 일부를 구성하는 당신은 단순히 코드에서 그 하부의 다른

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

모두 같은 것을 사용하여 데이터를 플롯, 그리고 6

이외의 값입니다 사용 무작위로 샘플 데이터를 수집하거나 플롯에 다른 종소리와 휘파람을 추가 할 수 있습니다. 기본적인 작업을 한 후에 만 ​​놀아 보는 것이 가장 좋습니다.

+0

마이크 감사합니다. 시도해보고 내가 어떻게하는지 봅니다. – user2349107

+0

죄송합니다.아마도 데이터 모양이 완전히 틀렸을 것입니다. 잠시 시정합니다. – Mike

+0

@Mike 귀하의 설명은 정말 좋았고 나를 도와 줬어! 한가지, x와 y의 고유 한 값을 추출하면 왜 meshgrid를 수행하지 않습니까? 아니면 plt.contour가 처리합니까? – ashishv