#!/bin/bash
#
# Use gnuplot to plot the data in <data_file> (by default stdin).
# If "-v <vcol_start>" is specified, then the columns starting with
# from vcol_start contain variation values for the data in columns 2, 3, ...
# +/- variation is plotted as a band around the plot line.
#
# If -n is specified, then just copy data_file to stdout.
usage_args="[-geometry WxH+x+y] [-t title] [-x xlabel] [-y ylabel] [-w width] [-h height] [-X xrange] [-Y yrange] [-k keyopts] [-lt ltfile] [-o output_file] [-u] [-v vcol_start] [-cat] [data_file]"
geom=
width=350
height=200
title=
xlabel=
ylabel=
output_file=
output_cmd=
term=
termopt_cmd=
keyopts="top center"
ltfile=
vcol_start=
nflag=
while [ $# -gt 0 ]
do
case "$1" in
-geometry) geom="-geometry $2"; shift;;
-t) title="$2"; shift;;
-x) xlabel="$2"; shift;;
-y) ylabel="$2"; shift;;
-w) width="$2"; shift;;
-h) height="$2"; shift;;
-Y) yrange="$2"; shift;;
-X) xrange="$2"; shift;;
-k) keyopts="$2"; shift;;
-lt) ltfile="$2"; shift;;
-o) output_file=$2; shift;;
-u) termopt_cmd="set termoption noenhanced";;
-v) vcol_start="$2"; shift;;
-x11) term=x11;;
-n) nflag=-n;;
--) shift; break;;
-*)
echo >&2 \
"usage: $0 $usage_args"
exit 1;;
*) break;;
esac
shift
done
# if no data_file specified, copy stdin to a tmpfile and read it
#
if [ $# -eq 0 ]; then
data_file=/tmp/$$
cat > $data_file
if [ "$title" == "" ]; then
title="<stdin>"
fi
elif [ $# -eq 1 ]; then
data_file=$1; shift
else
echo >&2 "usage: $0 $usage_args"
exit 1
fi
# Verify that $data_file is a regular file
#
if [ -d $data_file ]; then
echo >&2 "$data_file is a directory, doofus."
exit 1
elif [ ! -f $data_file ]; then
echo >&2 "No such file: $data_file"
exit 1
fi
if [ "$nflag" != "" ]; then
cat $data_file
exit 0
fi
if [ "$title" == "" ]; then
title=$data_file
fi
if [ "$xrange" == "" ]; then
xrange_cmd=""
else
xrange_cmd="set xrange $xrange"
fi
if [ "$yrange" == "" ]; then
yrange_cmd=""
else
yrange_cmd="set yrange $yrange"
fi
num_columns=`awk 'END {print NF;}' < $data_file`
if [ "$vcol_start" != "" ]; then
((data_columns = $vcol_start - 1 ))
else
((data_columns = $num_columns ))
fi
declare -i i
plots=
for (( i=2; i <= $data_columns; i++ ))
do
if [ "$vcol_start" != "" ]; then
(( v = $vcol_start + $i - 2 ))
plots+="'$data_file' using 1:(\$$i-\$$v):(\$$i+\$$v) with filledcurves notitle lt $((i-1)),"
fi
plots+="'$data_file' using 1:$i title column($i) with lines lt $((i-1))"
if (( i != $data_columns)); then
plots+=","
fi
done
#echo "PLOTS *** " $plots
(( fontsize = $width / 40 ))
if [[ "$output_file" == *.svg ]]; then
term_cmd="set terminal svg enhanced size $width,$height font 'Arial,$fontsize' enhanced background rgb 'white'"
output_cmd="set output \"$output_file\""
elif [[ "$output_file" == *png ]]; then
output_cmd="set terminal png; set output \"$output_file\""
elif [[ "$output_file" != "" ]]; then
echo "Unknown output file type"
exit 2
elif [[ "$term" == x11 ]]; then
term_cmd="set terminal x11 size $width,$height background rgb 'white'"
else
# term_cmd="set terminal wxt size $width,$height font \"Arial,$fontsize\""
term_cmd="set terminal wxt size $width,$height font \"Arial\""
fi
gnuplot -p $geom $ltfile - <<__END__
reset
$term_cmd
set title "$title" offset 0,-0.5
set xlabel "$xlabel" offset 18,1.3
set ylabel "$ylabel" offset 2.5,2
set xtics offset 0,0.5
set lmargin 6
unset mouse
$xrange_cmd
$yrange_cmd
set key $keyopts
set style fill transparent solid 0.2 noborder
$output_cmd
$termopt_cmd
plot \
$plots
__END__
|