Как построить данные без отдельного файла, указав все точки внутри Gnuplot script?
Моя программа генерирует сценарии bash, которые вызывают gnuplot. Я не хочу делать дополнительный файл для хранения данных; есть ли какой-либо способ явным образом вызывать все значения? Или, возможно, bash создать временный файл.
Что-то вроде
plot {(1,5),(2,10),(3,1)}
- это то, что я ищу.
Ответы
Ответ 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
bash Один линейный график 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 )
)
Ответ 5
Решение заключается в использовании массивов и параметрических линий.
X="0.1 0.2 0.3 0.4 0.5"
Y="-1 0 2 4 8"
set parametric
set trange [1:words(X)]; set samples words(X)
plot (0+word(X,int(t))),(0+word(Y,int(t)))
выход
источник: https://groups.google.com/d/msg/comp.graphics.apps.gnuplot/UdiiC2cBQNo/xEyj6i7Y910J