gnuplot 내부의 루프 구조?


82

여러 파일에서 반복적으로 데이터를 검색하고 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 에서 플롯 부분 을 반복하는 방법이 있는지 궁금합니다 .


정말 아늑한 bash의 기능 대답 아래
Hastur

답변:


96

확실히 있습니다 (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루프에 더 가까운 것을 제공합니다 .


솔루션 "plot for [i = 1 : 1000] 'data'.i.'. txt '가 1 : 2 제목'Flow '.i'를 사용하여 저에게 효과적이었습니다. Windows에서 C ++와 함께 gnuplot 5.2를 사용하고 있습니다 .. ...
MasoodUrRehman

하지만 또 다른 문제가 있습니다. fream K를 통해 하드 디스크에 K 개의 파일을 쓰는 프로그램을 작성 중입니다 K는 전역 변수이므로 시도한 gnuplot을 사용하여 그래프에 K 개의 파일을 플로팅하고 싶습니다 [i = 1 : K]하지만 정의되지 않은 변수의 오류가 발생합니다. gnuplot에서 외부 for 루프를 시도했지만 작동하지 않습니다.
MasoodUrRehman

I가 사용할 때 [난 = 1 : K가]는 ... 오류가 있습니다 : 나는 위해와 작품 [5 전 = 1] 것을의 gnuplot을위한 C ++에서 함수를 썼다
MasoodUrRehman

@MasoodUrRehman gnuplot 스크립트에서 C ++ 코드의 변수를 사용하려는 것 같습니다. gnuplot에 명령을 보낼 때 변수 K의 값을 인쇄하고 있는지 확인하십시오. Gnuplot은 C ++는 K가 무엇인지 알고 있지만 gnuplot은 알지 못하기 때문에 '정의되지 않은 변수'라고 말합니다. 그래도 문제가 해결되지 않으면 문제를 별도의 C ++ 질문으로 게시하는 것이 좋습니다.
andyras

83

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/


1
반복자 t를 사용하여 예를 들어 파일 이름이나 색상의 배열에서 인덱스를 참조 할 수도 있습니까?
tommy.carstensen 2013 년

1
나는 시도한 적이 없지만 그것에 대해 아무런 문제가 없습니다. 결국 다른 가능성은에 표시된대로 대괄호 안에 배열의 항목 (색상, 이름 등)을 직접 지정하는 것입니다 help do.
DarioP 2013 년

1
나는 이것이 어떻게 달성 될 수 있는지 분명하지 않기 때문에 여기에 새로운 질문을했다. stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot .
tommy.carstensen 2013-09-03

10

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).


나를 위해 귀하의 코드가 작동하지 않습니다. list=system(ls -1B *.dat)대신 글을 써야 했습니다.
Jaxan

흠, 좋아요. 나는 Linux에서 버전 4.6을 사용했습니다.
Jonatan Öström

1
그래서 나는 그것을 다시 시도했지만 당신이 말했듯이 작동하지 않습니다. 명령이 작동하려면 시스템 호출 내에서 광고 작은 따옴표를 사용해야했습니다.list=system('ls -1B *.dat')
Jonatan Öström

그것은 나를 위해 작동하지 않습니다. 따옴표 포함 또는 제외. 왜?
samira 2005

@samira 모르겠어요.
Jonatan Öström

4

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

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

연속되지 않은 숫자를 반복하는 방법을 보여주는 예제 만 여기에 제공됩니다.
rehctawrats

2

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


파일없이 plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }호출 gnuplot하지 않도록 추가 할 수 있습니다 .
Hastur jul.

0

다음은 대체 명령입니다.

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.