2012-12-06 2 views
4

계속 업데이트되는 데이터 파일이 있습니다. gnuplot을 사용하여 업데이트 데이터 파일을 동적으로 플롯 (plot) 할 수 있습니다. 아마도 마지막 100 데이터 포인트의 창을 사용했을 것입니다.동적 Gnuplot 그래프

가능합니까? 그렇다면, 일부 포인터는 높이 평가됩니다.

+0

어떤 OS가 실행되고 있습니까? Gnuplot의 어떤 버전입니까? –

답변

5

불행히도 Gnuplot에는 이러한 작업을 수행 할 수있는 내장형 방법이 없기 때문에 IIRC GNU plotutils가 제공합니다. 플롯 명령을

# An updating data file 
while :; do echo $((RANDOM%100)); sleep .1; done > datafile 

초기화의 gnuplot, 다른 업데이트가 replot에서 오게 :

(
    echo "plot [0:100] [0:100] '< tail -n100 datafile' with lines"; 
    while :; do sleep .4; echo replot; done 
) | gnuplot -persist 

어쨌든, 여기에 한 가지 방법은 당신의 gnuplot 일부 bash는 스크립트로 작업을 수행 할 수있어 이렇게하면 Gnuplot은 매초마다 tail -n100 datafile을 평가하고 그 결과를 데이터 세트로 사용합니다. tail 명령은 datafile의 마지막 100 행을 리턴합니다.

+0

그것이 효과가있다. 감사! – mlomailom

0

동적 이것은 Google을 간단한 핑 샘플이다

를 플롯 구동 스크립트

#!/bin/bash 

export DEST=${1:-google.com} DELAY=${2:-3} GPFD 
openGnuPlot() { 
    local fd=1 
    while [ -e /dev/fd/$fd ];do ((fd++)) ;done 
    eval "exec $fd> >(gnuplot)" 
    GPFD=$fd 
} 
openGnuPlot 

TMPDIR=/tmp 
[ -d /dev/shm ] && [ -w /dev/shm ] && TMPDIR=/dev/shm 
read TMPDATA < <(mktemp -p $TMPDIR --suffix .dat plot-XXXXXXXXXX) 
trap "exec $GPFD>&-;[ -f $TMPDATA ]&&rm $TMPDATA;exit" 0 1 2 3 6 9 15 
getDatas() { 
    read data < <(
     ping -c 1 -n $DEST 2>&1 | 
      sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d' 
    ) 
    printf "%(%s)T %s\n" >>$TMPDATA -1 "$data" 
    printf "%(%a %b %d %T)T %s\n" -1 "$data" 
} 
getDatas 

echo >/dev/fd/$GPFD "set term wxt noraise persist title 'Ping $DEST';" 
echo >/dev/fd/$GPFD "set xdata time;" 
echo >/dev/fd/$GPFD "set timefmt '%s';" 

while :;do 
    sleep $DELAY 
    getDatas 
    echo >/dev/fd/$GPFD \ 
     "plot '$TMPDATA' using 1:2 with line title 'ping $DEST';" 
done 

데모 : 복수의 호스트와

Sample Bash Dyn GnuPlot Graph with ping google.com

2 샘플

,536,913,632 10

이 스크립트는 많은 동시 핑을하고 dynamicaly 다음 구문

#!/bin/bash 

export DEST=${1:-google.com} DELAY=${2:-3} GPFD 
openGnuPlot() { 
    local fd=1 
    while [ -e /dev/fd/$fd ];do ((fd++)) ;done 
    eval "exec $fd> >(gnuplot)" 
    GPFD=$fd 
} 
openGnuPlot 

TMPDIR=/tmp 
[ -d /dev/shm ] && [ -w /dev/shm ] && TMPDIR=/dev/shm 
read TMPDATA < <(mktemp -p $TMPDIR --suffix .dat plot-XXXXXXXXXX) 
trap "exec $GPFD>&-;[ -f $TMPDATA ]&&rm $TMPDATA;exit" 0 1 2 3 6 9 15 

getDatas() { 
    local -A var tim 
    local host out 
    while IFS=$' \t:,()\n\r' read a b c d e f g h; do 
     case $a in 
      PING)  printf -v var[$c] $b ;; 
      64)  printf -v tim[${var[$d]}] ${g#*=} ;; 
     esac 
    done < <(for host; do ping -nc1 $host & sleep .01;done) 
    for host; do 
      out+=" "${tim[$host]:--1} 
    done 
    printf "%(%s)T %s\n" >>$TMPDATA -1 "$out" 
    printf "%(%a %b %d %T)T %s\n" -1 "$out" 
} 

echo >/dev/fd/$GPFD "set term wxt noraise persist title 'Ping $DEST';" 
echo >/dev/fd/$GPFD "set xdata time;" 
echo >/dev/fd/$GPFD "set timefmt '%s';" 

plotlines=() fld=2 
for host in $DEST;do 
    plotlines+=("'$TMPDATA' using 1:$((fld++)) with line title 'ping $host'") 
done 
IFS=, eval 'plotcmd="plot ${plotlines[*]};"' 

getDatas $DEST 
while :;do 
    sleep $DELAY 
    getDatas $DEST 
    echo >/dev/fd/$GPFD "$plotcmd" 
done 

샘플 실행을 그래프 : script.sh "stackoverflow.com google.com" 4 4 초 지연, 유래구글 동시에에서 핑 그래프를 수행하십시오.

경고 : gif 애니메이션 지연이 완전히 가짜입니다!

enter image description here