2013-04-15 4 views
0

gnuplot에서 펜스 플롯을 만드는 방법을 알아 내려고했지만 인터넷에서 찾은 예제에서 무슨 일이 벌어지고 있는지 이해하는 데 어려움을 겪고 있습니다.Gnuplot : 데이터의 펜스 플롯

t1 x11 y11 // indices here indicate that (x1,y1) are a data point which 
t1 x21 y21 // I'd plot on a regular 2D plot for this timestep, with the 
...    // additional index noting which time step the values are for. 
t1 xN1 yN1 
[blank line] 
t2 x12 y12 
t2 x22 y22 
... 
t2 xN2 yN2 
[etc...] 
tM xNM yNM 

내가 하나가이 음모하려면 :

나는 값의 행렬 1로 구성 데이터 파일에 내 시뮬레이션에서 서로 다른 시점에서 데이터 세트의 (다양한) 번호가 각 시간 가치에 울타리. 간단하게 splot 'data.txt'을 음모를 꾸미고 내가 원하는 것과 비슷한 것을 얻을 수 있습니다 - + 울타리의 "상단 가장자리"를 따라 마커, x 축에 시간, y 축에 x- 데이터, z 축에 y- 데이터. 그러나, w lines과 같은 것을 splot 명령에 추가하면 모든 데이터 시리즈가 연결된 표면이 생깁니다.

the demo script collection (약 절반 정도)에서 예제를 적용하려고 시도했지만 모두 더미 변수에 의존하고 있으며이를 데이터 시리즈와 결합하는 방법을 알 수 없습니다. 나는 다른 몇 가지 예언도 찾았지만 모두 아주 정교하고 나는 그들이하는 일을 전혀 이해하지 못한다.

gnuplot을 사용하여 데이터에서 펜스 플롯을 만드는 좋은 방법은 무엇입니까?


1 것이 필요 있다면,이를 변경할 수 있습니다 - 내가 데이터를 생성하는 코드의 제어입니다. 그러나 번거 로움입니다 ...

+0

'뭔가'- 나는 하나 ... – mgilson

+0

을 기억해야합니다 @ * 위첨자 *가 짧다는 것을 안다면 쉽게 기억할 수 있습니다. ' something'이 무엇을 할 수 있습니까? ;) –

답변

3

이것은 불행히도 데이터를 약간 변경해야합니다. 변화는하지만 아주 사소한 아마도 간단한 awk1, 2 스크립트를 처리 할 수있다 :

gnuplot> !cat test.dat 
1 2 3 
1 2 0 

1 3 4 
1 3 0 

1 4 5 
1 4 0 


2 2 3 
2 2 0 

2 3 4 
2 3 0 

2 4 5 
2 4 0 


3 2 3 
3 2 0 

3 3 4 
3 3 0 

3 4 5 
3 4 0 
! 
gnuplot> splot 'test.dat' u 1:2:3 w lines 

여기에서 주목해야 할 것은 다음과 같습니다

내 상호 작용의 gnuplot 세션의 복사/붙여 넣기입니다 "울타리"사이에 빈 줄이 2 개 있고 각 x, y 데이터 지점이 두 번 공백 줄과 함께 나타납니다. awk 스크립트도 인라인을 수행 할 수 있습니다

gnuplot> splot for [i=0:3] 'test.dat' index i u 1:2:3 w lines 

:

splot "< awk {...} datafile" 

은,는 z 좌표가 나타납니다 두 번째 시간은 0

다른 색으로 각각의 울타리를 얻는 것입니다 그러나 이것은 따옴표로 약간 까다로울 수 있습니다. 작은 따옴표로 묶은 문자열에 작은 따옴표를 포함 시키려면 두 배로하십시오 ...

AWKCMD='awk ''{if(!NF){print ""}else if(index($0,"#")!=1){printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}'' ' 
splot '<'.AWKCMD.'datafile.dat' u 1:2:3 w lines 

효율성에 관한 한, 위의 반복을 반복 할 때마다 awk 명령이 호출 될 것입니다. 여기에 해결 방법은 인덱스 번호에서 색상을 당겨하는 것입니다

splot '<'.AWKCMD.' test.dat' u 1:2:3:(column(-2)) w l lc variable 

나는 여전히 상대적으로 빠르게 응답해야 만 만 항목이 있으므로 원하는대로이 한 번만 awk 명령을 할 것이라고 믿는다.


1awk '{if(!NF){print ""}else{printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}' test.dat

2awk '{if(!NF){print ""}else if(index($0,"#")!=1){printf "%s %s %s\n%s %s 0\n\n", $1,$2,$3,$1,$2}}' test.dat (코멘트를 무시하는 버전)

+0

고마워요! 몇 가지 후속 질문 : 1) 이전에 'awk'을 사용한 적이 없습니다. '# '으로 시작하는 모든 줄을 무시하도록 어떻게 수정합니까? 나는 데이터 파일 (나중에 참조 할 수 있도록 실행에 관한 몇 가지 정보)에서 진단 출력을 인쇄하는데 사용하며, 그대로 유지하려고합니다. 2) 성능이 좋지 않습니까? 하나의 데이터 파일에는 보통 ~ 10^5-10^6 행의 데이터가 들어 있습니다. 3) 실수가 아니라면 gnuplot 스크립트에서 직접 두 단계를 수행하는 대신이 작업을 수행 할 수 있습니다. 어떻게해야합니까? 다시 한 번 감사드립니다! –

+0

@TomasLycken - 내 업데이트를 참조하십시오. – mgilson

+0

Brilliant! 바로 그 것처럼 - 그것은 나에게 아름다움을 준다! 나는 투명성 등을 가지고 조금 더 나아지기 위해 놀아야 할 것이다. 그러나 그것은 또 다른 문제이다. 고마워요! –