2017-03-14 4 views
1

행마다 플롯 I 많은 파장 w의 반경 R과 강도 I의 값이 형식의 gnuplot

0 R1 R2 R3 R4 
w1 I1 I2 I3 I4 
w2 I1 I2 I3 I4 
w3 I1 I2 I3 I4 

가진 파일이되다. 2D로 플롯하고 싶습니다. x 축에 1 번 행 (반경)을, y2 축에 3 번 행을 (w2를 선택하여) 만듭니다.

줄 당 줄 수는 무엇입니까? 열 단위가 아님

답변

0

아마도 가장 우아한 해결책은 아니지만 먼저 두 개의 선 (관심있는 파장에 해당하는 x 값과 선을 포함하는 머리글)을 필터링하고, 나란히 인쇄하고, 마지막으로 플롯 할 수 있습니다 이 보조 데이터는 Gnuplot을 사용합니다. 이를 위해

이 전략은 당신이 다음과 같은 내용으로의 gnuplot을 실행하려는 디렉토리에라는 스크립트, 예를 들어, filter.awk을 생성하는 것입니다 :

NR==1{ 
    N = NF-1; 
    for(i=1;i<=N;i++) x[i] = $(i+1); 
    next; 
} 

$1==w{ 
    printf "#%f\n", $1; 
    for(i=1;i<=N;i++) print x[i], $(i+1); 
    printf "\n"; 
} 

이 첫 번째에서 x 값을 기억 라인에 저장하고 배열 x에 저장합니다. 파장은 w 변수를 통해 명령 줄 인수 (아래 참조)로 전달됩니다. 데이터의 첫 번째 열이 w이면이 스크립트는 첫 번째 열에 x 값을, 두 번째 열에 y 값 (현재 행에서 가져옴)을 생성합니다.

의 gnuplot에서 당신은 다음으로 사용할 수 있습니다 data.dat이 입력 데이터와 100의 값이 필터링 할 예상되는 파장을 나타내는 것

plot \ 
    '<gawk -v w=100 -f filter.awk data.dat' w l 

.

이것을 일반화 한 예에 대해 수행 할 수 : 여기서

cmd(w)=sprintf('<gawk -v w=%f -f filter.awk test.dat', w); 

plot for [w in "100 200"] cmd(w+0) w l t sprintf('wave length of %.1f', w+0) 

, 플로팅 명령 파장을 나타내는 하나 개의 인자를 받아들이 cmd 함수를 통해 생성된다. 그런 다음 plot 명령은 웨이브의 "목록"을 반복하고 사용자 정의 제목을 사용하여 개별적으로 그립니다. 문 w+0은 여기에 명시 적으로 문자열 값 w을 숫자로 변환하는 데 사용됩니다.

0

하나의 해결 방법은 적절한 형식 (열의 데이터)으로 새 파일을 만드는 것입니다.

at(file, row, col) = system(sprintf("awk -v row=%d -v col=%d 'NR == row  {print $col}' %s", row, col, file)) 
file="myFile" 

따라서 귀하의 새 파일을 구성하고 플롯 :

먼저 파일에서 데이터를 읽을 수있는 함수를 작성 ("는의 gnuplot 변수 X 시리즈 (시작)에 읽기 데이터 세트 값"항목을 참조하십시오)
do for [j=1:5] { # 5 = number of your columns 

x = at(file,1,j) # x axis in your example 
y = at(file,3,j) # y axis 
set print "newFile.txt" append 
print x," ",y 
set print 
} 

plot "newFile.txt" 

처리 할 때마다 newFile.txt을 반드시 삭제하십시오.