From 715ac4dd67b766d3917c107e66609cecd700f2b2 Mon Sep 17 00:00:00 2001 From: fpi Date: Sun, 19 Jun 2022 20:30:08 +0200 Subject: Add function to plot live data streams --- gnuplot.org | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/gnuplot.org b/gnuplot.org index a9ec9f4..06359c9 100644 --- a/gnuplot.org +++ b/gnuplot.org @@ -4,6 +4,7 @@ First create a symlink to the desired config location. #+begin_src shell :results silent :tangle tangle/symlink.sh :shebang "#!/bin/bash" ln -siv $(pwd)/tangle/.gnuplot ~/ +ln -siv $(pwd)/tangle/gnuplotwindow.sh ~/.local/bin #+end_src * General Configuration Start off by resetting most settings. @@ -105,6 +106,80 @@ Support function to set x/y tic formatting with ~set format x formatter(".0","m" #+begin_src gnuplot formatter(prec,unit)=sprintf("%%%ss %%c%s", prec, unit) #+end_src +* Live data streams +[[http://flux242.blogspot.com/2016/02/visualization-of-live-data-streams-with.html][Alex's blog: Visualization of live data streams with the gnuplot and bash]] describes how continuous data streams can be fed to gnuplot using the script below. +#+begin_src sh :eval never :tangle tangle/gnuplotwindow.sh :tangle-mode (identity #o555) +#!/usr/bin/env bash + +# Example: +# nc -luk 6666 | jq --unbuffered -c 'select(.id==129)|.temperature_C' | \ +# GNUPLOT_TERM='sixelgd animate' ~/bin/gp/gnuplotwindow.sh 6000 "10:25" "Outside temperature;2;red" + +terminal="${GNUPLOT_TERM:-qt}" # terminal type (x11,wxt,qt,pdfcairo,pngcairo,..) +output="${GNUPLOT_OUT}" +output_ext="${GNUPLOT_EXT}" +winsize=${1:-60} # number of samples to show +yrange=${2:-0:100} # min:max values of displayed y range. + # ":" for +/- infinity. Default "0:100" +shift;shift # the rest are the titles + +styles_def=( "filledcurves x1" "boxes" "lines" ) +# remove the color adjustment line below to get +# default gnuplot colors for the first six plots +# colors_def=("red" "blue" "green" "yellow" "cyan" "magenta") +colors=( "${colors_def[@]}" ) + +# parsing input plots descriptions +i=0 +IFS=$';' +while [ -n "$1" ]; do + tmparr=( $1 ) + titles[$i]=${tmparr[0]} + styles[$i]=${styles_def[${tmparr[1]}]-${styles_def[0]}} + colors[$i]=${tmparr[2]-${colors_def[$i]}} + i=$((i+1)) + shift +done + +IFS=$'\n' +samples=0 # samples counter +(while read newLine; do + [ -n "$newLine" ] && { + #nf=$(echo "$newLine"|awk '{print NF}') + nf=0;TMPIFS=$IFS;IFS=$' \n' + for j in $newLine;do nf=$((nf+1));done + IFS=$TMPIFS + a=("${a[@]}" "$newLine") # add to the end + [ "${#a[@]}" -gt "$winsize" ] && { + a=("${a[@]:1}") # pop from the front + samples=$((samples + 1)) + } + echo "set term $terminal noraise" + [[ -n "$output" ]] && { + echo "set output "\""${output}.$samples.${output_ext}"\" + } + echo "set yrange [$yrange]" + echo "set xrange [${samples}:$((samples+${#a[@]}-1))]" + echo "set style fill transparent solid 0.5" + echo -n "plot " + for ((j=0;j/dev/null +#+end_src * A4 plots See [[https://milianw.de/blog/how-to-generate-proper-din-a4-sized-plots-with-gnuplot.html][How to generate proper DIN A4 sized plots with Gnuplot - Milian Wolff]]. -- cgit v1.2.3