Подтвердить что ты не робот

Как построить данные без отдельного файла, указав все точки внутри Gnuplot script?

Моя программа генерирует сценарии bash, которые вызывают gnuplot. Я не хочу делать дополнительный файл для хранения данных; есть ли какой-либо способ явным образом вызывать все значения? Или, возможно, bash создать временный файл.

Что-то вроде

plot {(1,5),(2,10),(3,1)}

- это то, что я ищу.

4b9b3361

Ответ 1

Вы можете использовать синтаксис для встроенных данных - имя_файла '-'.

В следующем примере создается простой график изображения GIF (bash script):

gnuplot << EOF
set terminal gif
set output 'plot1.gif'
plot '-' using 1:2
        1 10
        2 20
        3 32
        4 40
        5 50
        e
EOF

Ответ 2

Gnuplot 5.0.1 блоки данных

main.gnuplot

$data << EOD
1 1
2 4
3 9
4 16
EOD

plot "$data" \
  with linespoints \
  title "my data"

Преобразовать в PNG:

gnuplot -e 'set terminal png' -e 'set output "main.png"' main.gnuplot

Выход:

enter image description here

Этот метод является немного более универсальным, чем '-', поскольку это облегчает повторное использование несколько раз же данные, в том числе и на том же plot команды: fooobar.com/questions/205386/...

Версия 5 доступна в Ubuntu 15.04 или может быть скомпилирована из исходного кода: https://askubuntu.com/a/684136/52975

Вы также можете быть заинтересованы в специальных именах файлов + и ++ при построении функций.

Протестировано на Ubuntu 18.10, gnuplot 5.2.

Ответ 3

Пример использования оболочки с конвейером,

gnuplot -p <(echo -e 'plot "-"\n1 1\ne')

Ответ 4

Один линейный график ping с Gnuplot

Извините, это не свет (361 символ):

gnuplot -p -e "set xdata time;set timefmt '%s';set xrange [ '$(date +%s)' : '$(date -d 'now +30 seconds' +%s)' ];plot '-' using 1:2 with line title 'ping google';" < <(( ping -c 30 -n google.com| sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d' | tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)) | sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */\2 \1/;s/d//')

Запуск этой строки будет удерживать ваш терминал в течение 30 секунд, чем график на экране. График, показывающий задержку ping на google.com за последние 30 секунд.

Та же строка может быть разделена так же (тоже можно работать):

gnuplot -p -e "
    set xdata time;
    set timefmt '%s';
    set xrange [ '$(
        date +%s
      )' : '$(
        date -d 'now +30 seconds' +%s
      )' ];
    plot '-' using 1:2 with line title 'ping google';
    " < <((
    ping -c 30 -n google.com |
        sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d' |
        tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)) |
    sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */\2 \1/;s/d//'
)

Но это не печатает значения!

Итак, я добавил несколько байтов:

gnuplot -p -e "set xdata time;set timefmt '%s';set xrange [ '$(date +%s)' : '$(date -d 'now +30 seconds' +%s)' ];plot '-' using 1:2 with line title 'ping google';" < <(( ping -c 30 -n google.com| sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d' | tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)  ) | sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */\2 \1/;s/d//' | tee >(printf "%(%T)T %s\n" $(</dev/stdin) | column -c $COLUMNS >&2 ))

Это может создать такое окно:

введите описание изображения здесь

И одновременно печатайте на терминале:

17:58:53 19.6   17:59:00 124    17:59:07 159    17:59:13 194    17:59:19 17.1
17:58:54 18.7   17:59:02 19.4   17:59:08 20.3   17:59:14 16.8   17:59:20 20.0
17:58:55 17.9   17:59:03 180    17:59:09 76.4   17:59:15 48.9   17:59:21 192
17:58:57 115    17:59:04 186    17:59:10 226    17:59:16 221    17:59:22 17.1
17:58:58 18.5   17:59:05 16.8   17:59:11 109    17:59:17 19.0
17:58:59 17.0   17:59:06 184    17:59:12 18.8   17:59:18 18.7

Переписано разделение:

gnuplot -p -e "
    set xdata time;
    set timefmt '%s';
    set xrange [ '$(date +%s)' : '$(date -d 'now +30 seconds' +%s)' ];
    plot '-' using 1:2 with line title 'ping google';" < <(
  (
      ping -c 30 -n google.com |
        sed -u 's/^64.*time=\([0-9.]\+\) .*$/\1/p;d' |
        tee >(sed -u 's/.*/now/'| stdbuf -oL date -f - +d%s)
  ) | sed -u 'N;s/\n/ /;s/\([0-9.]\+\) d\([0-9]\+\) */\2 \1/;s/d//' |
  tee >(printf "%(%T)T %s\n" $(</dev/stdin) |
  column -c $COLUMNS >&2 )
)