2014-09-03 5 views
3

내 문제는 내 이전 질문에서 다음, 지금과 같이 간다 : 나는 비행기에서 움직이는 입자가, 지금은 XY와의 입자의 위치를 ​​말한다 측면 상자의 종류를 원하는 그 속도. 나는 라벨을 사용해 보았지만 서로 겹치게되었다.의 gnuplot : 애니메이션 레이블

+------------------------------------------+ 
    |   +-----------+     | 
    |   |   |  t = 2  | 
    |   | PLOT HERE | x = 0 y = 1 | 
    |   |   | vx = 2 vy = 3 | 
    |   +-----------+     | 
    +------------------------------------------+ 

그 숫자는 각 프레임에서 변경 될 수 :

는 여기에 내가보고 싶은의 정말 원유 "스케치"입니다. 타이틀을 움직일 수 있었지만 라벨이 다르게 보입니다.

내 현재 코드는 매우 여기 GNUPlot - Plot 2D datapoints as MPEG에서 답처럼하지만 약간의 문체 수정을보고, 나는 제목을 제거하는 것이. 저는 지금 XY 좌표 인 데이터를 생성 할 수 있습니다. 이것은 제가 지금 사용하고있는 것입니다. (이 그냥 그림을 위해, 임의 점이다)처럼

나는 또한 생기 라벨

#X  Y  t  vx  vy 
    0.00 1.00 0.0  0.0 6.28 
    0.01 0.01 0.01 1.0 6.00 

뭔가를 생성 할 수 있습니다. 데이터 파일에서 레이블을 배치하기위한

답변

2

좋은 방법은 labels 플로팅 스타일이다. 그러나 실제 점선 영역 외부에 레이블을 배치하는 데는 몇 가지 어려움이 있습니다. 일반적으로 점과 레이블은 잘립니다.

당신은 x 및 yrange를 해결하기 위해 stats 어쨌든을 사용하고 있기 때문에, 여기에 내가 이런 짓을 했을까 방법입니다

  • 예와 고정 오른쪽 여백을 설정합니다 set rmargin 20. 오른쪽 여백은 20 자 너비입니다. set rmargin at screen 0.8과 같은 절대 좌표를 사용할 수도 있지만, 레이블을 배치 할 여백이 필요하므로 문자 단위가 적절합니다.

  • 플롯 영역의 오른쪽 위 모서리를 참조 점 (STATS_max_x, STATS_max_y)으로 사용하고 offset 매개 변수를 사용하고 몇 가지 문자 폭으로 다시 이동하여 레이블을 이동하십시오.

그래서 같이 보일 수 있습니다 완전한 스크립트는 다음과 같습니다

# calculate the number of points 
stats 'file.txt' using 1:2 nooutput 

# if you want to have a fixed range for all plots 
set xrange [STATS_min_x:STATS_max_x] 
set yrange [STATS_min_y:STATS_max_y] 

set terminal pngcairo size 800,400 
outtmpl = 'output%07d.png' 

v_label(x, y) = sprintf('vx = %.2f vy = %.2f', x, y) 
c_label(x, y) = sprintf('x = %d y = %d', x, y) 
t_label(t) = sprintf('t = %.2f', t) 

set rmargin 20 

do for [i=0:STATS_records-1] { 
    set output sprintf(outtmpl, i) 
    plot 'file.txt' every ::::i with lines title sprintf('n = %d', i),\ 
     '' every ::i::i using (STATS_max_x):(STATS_max_y):(t_label($3)) with labels offset char 11,-5 notitle,\ 
     '' every ::i::i using (STATS_max_x):(STATS_max_y):(c_label($1, $2)) with labels offset char 11,-6.5 notitle,\ 
     '' every ::i::i using (STATS_max_x):(STATS_max_y):(v_label($4, $5)) with labels offset char 11,-8 notitle 
} 

set output 

Script output for t=0.01

참고는 rmarginoffset 설정은 터미널, 터미널 크기, 글꼴 및 글꼴 크기에 달려있다. 더 좋은 라벨 배치를 위해 당신은 자신의 정렬을 변경 별도로 어쩌면 vxvy 레이블을 배치하는 것이 좋습니다.

다른 방법으로 각각의 반복에서 당신은 당신의 데이터 파일에서 현재 행을 추출하여 수동으로 레이블을 설정합니다. 그러나 외부 도구를 사용하여 줄을 추출해야합니다.

do for [i=0:STATS_records-1] { 
    line = system(sprintf("sed -n %dp file.txt", i+2)) 
    set label 1 at screen 0.9, screen 0.9 sprintf("t = %.2f", real(word(line, 3))) 
    set label 2 at screen 0.9, screen 0.88 sprintf("x = %.2f y = %.2f", real(word(line, 1)), real(word(line, 2))) 
    plot 'file.txt' every ::::i with lines title sprintf('n = %d', i) 
} 

어떤 변형이 더 잘 맞는지 알 수 없습니다. 줄 번호로 i+2을 사용하여 자동으로 검색되지 않는 주석 처리 된 헤더 행을 건너 뜁니다. 라벨 (set label 1)에 태그를 사용하면 이전 라벨을 덮어 씁니다. 이상하다

+0

.터미널에서 "23 행 : 경고 : 유효한 점이없는 데이터 파일 건너 뛰기"가 표시되며 모든 _other_ 프레임에 레이블이 나타납니다. 또한 t 및 vx 및 vy 레이블 만 업데이트됩니다. xy 레이블은 xy 축 (파티클이 타원으로 움직이는 경우)에서만 바뀌므로 (0,1), (-1,0) 등이됩니다. – vardonir

+0

스크립트를 게시 할 때 두 (Windows 4.6.5, Linux 4.6.0, 4.6.5 및 5.0rc2). 이 최소한의 구성을 시도 했습니까? – Christoph

+0

오, 전 ~ 2000 라인으로 전체 프로그램을 사용하고있었습니다. 나는 두 개의 데이터 라인을 가지고 시험해 보았고, 잘 작동했다. – vardonir