[gnuplot] gnuplot 내부의 루프 구조?

여러 파일에서 반복적으로 데이터를 검색하고 gnuplot의 동일한 그래프에 플로팅하는 방법이 있습니까? data1.txt, data2.txt …… data1000.txt와 같은 파일이 있다고 가정합니다. 각각 동일한 수의 열이 있습니다. 이제 다음과 같이 쓸 수 있습니다.

plot "data1.txt" using 1:2 title "Flow 1", \
     "data2.txt" using 1:2 title "Flow 2", \
      .
      .
      .
     "data1000.txt"  using 1:2 title "Flow 6"

그러나 이것은 정말 불편할 것입니다. gnuplot 에서 플롯 부분 을 반복하는 방법이 있는지 궁금합니다 .



답변

확실히 있습니다 (gnuplot 4.4 이상) :

plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i

변수 i는 변수 또는 문자열로 해석 될 수 있으므로 다음과 같이 할 수 있습니다.

plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i

선이 서로 오프셋되도록하려면.

help iteration자세한 내용은 gnuplot 명령 줄에 입력 하십시오.

do for구문 에 대한 @DarioP의 답변도 확인하십시오 . 기존 for루프에 더 가까운 것을 제공합니다 .


답변

do { ... }매우 강력한 gnuplot 4.6 이후 의 명령 도 살펴보십시오 .

do for [t=0:50] {
  outfile = sprintf('animation/bessel%03.0f.png',t)
  set output outfile
  splot u*sin(v),u*cos(v),bessel(u,t/50.0) w pm3d ls 1
}

http://www.gnuplotting.org/gnuplot-4-6-do/


답변

all.p 스크립트가 있습니다.

set ...
...
list=system('ls -1B *.dat')
plot for [file in list] file w l u 1:2 t file

여기서 마지막 두 행은 휴리스틱이 아니라 리터럴입니다. 그럼 난 달려

$ gnuplot -p all.p

*.dat가지고있는 파일 유형으로 변경 하거나 파일 유형을 추가하십시오.

다음 단계 :이 줄에 ~ / .bashrc 추가

alias p='gnuplot -p ~/./all.p'

그리고 파일을 all.p홈 디렉토리와 짜잔에 넣으십시오 . p를 입력하고 Enter를 눌러 디렉토리의 모든 파일을 플롯 할 수 있습니다.

편집 작동하지 않았기 때문에 명령을 변경했습니다. 이전에는 list(i)=word(system(ls -1B *.dat),i).


답변

그래프에 플로팅 할 불연속 열이있는 경우 다음을 사용하십시오.

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;
}


답변

어떤 디렉토리에서든 작업하면서 와일드 카드를 사용하여 종종 서로 다른 디렉토리에 배치 된 여러 파일을 플로팅하고 싶었습니다. 내가 찾은 해결책은 다음 기능을 만드는 것입니다.~/.bashrc

plo () {
local arg="w l"
local str="set term wxt size 900,500 title 'wild plotting'
set format y '%g'
set logs
plot"
while [ $# -gt 0 ]
        do str="$str '$1' $arg,"
        shift
done
echo "$str" | gnuplot -persist
}

그리고 예를 들어 , 현재 디렉토리의 모든 파일과 레벨 업되고라는 디렉토리의 plo *.dat ../../dir2/*.out모든 .dat파일 을 플로팅하는 것과 같이 사용하십시오 ..outdir2


답변

다음은 대체 명령입니다.

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'


답변