Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
software:gnuplot [2011/03/09 22:13]
cyril fix set size ratio -1
software:gnuplot [2024/04/19 09:54] (current)
cyril autotitle
Line 33: Line 33:
   * Axes tics.<code gnuplot>   * Axes tics.<code gnuplot>
 set ytics nomirror set ytics nomirror
-set y2tics -3.5,0.5,3.5 
-set ytics ("0.5" 0.5, "1.2" 1.2, "2.3" 2.3) 
 set y2tics auto set y2tics auto
 +set ytics 0.5
 +set ytics -3.5,0.5,3.5
 +set xtics ("0.5" 0.5, "1.2" 1.2, "2.3" 2.3)
 </code> </code>
  
Line 41: Line 42:
 set format x "%f" set format x "%f"
 set format y "%e" set format y "%e"
 +</code> Can be used to remove tics labels:<code gnuplot>
 +set format x ""
 +</code>For time formats:<code gnuplot>
 +set ydata time
 +set timefmt "%M:%S" # input format in data
 +set format y "%s"   # outpout format in labels
 </code> </code>
  
Line 52: Line 59:
 set x2label "" set x2label ""
 set y2label "" set y2label ""
 +</code>
 +
 +  * Log scale.<code gnuplot>
 +set logscale x 2
 +set logscale y 10
 </code> </code>
  
Line 62: Line 74:
 set key left bottom set key left bottom
 set key 100,100 set key 100,100
 +</code>
 +
 +  * Automatic legend.<code gnuplot>
 +set key autotitle columnheader
 </code> </code>
  
Line 100: Line 116:
   * Data separator (space by default).<code gnuplot>   * Data separator (space by default).<code gnuplot>
 set datafile separator "," set datafile separator ","
 +</code>
 +
 +  * Plot type (histogram)<code gnuplot>
 +set style data histogram
 +set style histogram errorbars gap 0 lw 2
 +set style fill solid border -1
 </code> </code>
  
Line 124: Line 146:
   * **every** Specifying lines to use (every 2 lines from line 50 to line 1050).<code gnuplot>   * **every** Specifying lines to use (every 2 lines from line 50 to line 1050).<code gnuplot>
 plot "data.dat" using 4:5 every 2::50::1050 plot "data.dat" using 4:5 every 2::50::1050
 +</code>
 +
 +  * **separator** Set the field separator:<code gnuplot>
 +set datafile separator ","
 </code> </code>
  
Line 136: Line 162:
   * **title/t** Functions titles.<code gnuplot>   * **title/t** Functions titles.<code gnuplot>
 plot "data1.dat" using 4:5 title "my curve" plot "data1.dat" using 4:5 title "my curve"
 +</code>
 +    * Use a variable in title.<code gnuplot>
 +a=2
 +plot "data1.dat" using 4:5 title sprintf("curve for a=%.5g",a)
 </code> </code>
  
Line 142: Line 172:
 plot "data1.dat" using 4:5 lt rgb "red" plot "data1.dat" using 4:5 lt rgb "red"
 plot "data1.dat" using 4:5 lt rgb "#FF0000" plot "data1.dat" using 4:5 lt rgb "#FF0000"
 +</code>
 +
 +  * **palette** Colors as value.<code gnuplot>
 +set palette defined (0 "black", 1 "red")
 +plot "data1.dat" using 1:2:0 w p palette
 </code> </code>
  
Line 173: Line 208:
 </code> </code>
  
-  * **($1)** Arithmetics on columns.<code gnuplot>+  * **($1)** Arithmetics on columns data.<code gnuplot>
 plot "data1.dat" using 4:($5/2+14) plot "data1.dat" using 4:($5/2+14)
 # where $n means column n # where $n means column n
 +</code>
 +
 +  * **(column())** Arithmetics on columns indices.<code gnuplot>
 +plot i=1, "data1.dat" using 1:(column(i+1))
 </code> </code>
  
Line 186: Line 225:
  
 plot "gps.dat" using (rotation_x($3,$4)):(rotation_y($3,$4)) plot "gps.dat" using (rotation_x($3,$4)):(rotation_y($3,$4))
 +</code>
 +
 +  * **word()** Define array variables.<code gnuplot>
 +colors="red blue green"
 +print word(colors,3)
 </code> </code>
  
   * **(?:)** Conditions.<code gnuplot>   * **(?:)** Conditions.<code gnuplot>
 max(x,y)=(x>y?y:x) max(x,y)=(x>y?y:x)
 +</code>Ignore line under condition:<code gnuplot>
 +use(x)=(x>0?x:0/0)
 </code> </code>
  
   * **for** Plot iteration.<code gnuplot>   * **for** Plot iteration.<code gnuplot>
 plot for [file in "run1.dat run2.dat run3.dat"] file using 1:2 plot for [file in "run1.dat run2.dat run3.dat"] file using 1:2
 +</code><code gnuplot>
 +plot for [i=1:3] run.dat using i t sprintf("curve %s", columnheader(i))
 </code><code gnuplot> </code><code gnuplot>
 file(n) = sprintf("run_%d.dat",n) file(n) = sprintf("run_%d.dat",n)
Line 199: Line 247:
 </code> </code>
  
-  * **fun()=(var=** Assign variables in functions.<code gnuplot>+  * **fun()=(var=** Make operations with different lines using variables assignment in functions
 +    * Make sequential operations, the final result is the value of the last operation:<code gnuplot> 
 +prev_x=0 
 +tmp=0 
 +sum_prev(x)=(tmp=prev_x, prev_x=x, x+tmp) 
 +</code> 
 +    * Using cumulated values of a column.<code gnuplot>
 sum=0 sum=0
 cumulated(x)=(sum=sum+x, sum) cumulated(x)=(sum=sum+x, sum)
-</code> +plot "idSlamDala.dat" using (cumulated($2)):
- +</code><code gnuplot>
-  * **awk** Make operations with different lines using variables. You can do it with gnuplot only or with ''awk''+
-    *  Using cumulated values of a column.<code gnuplot>+
 plot sum=0, "idSlamDala.dat" using (sum=sum+$2,sum):6 plot sum=0, "idSlamDala.dat" using (sum=sum+$2,sum):6
-plot "< awk '{sum=sum+$2; print sum,$6}' idSlamDala.dat" using 1:2 
 </code> </code>
-    * Using difference of two consecutive lines of the same column (''awk'' can ignore first line).<code gnuplot> +    * Subtract the initial value of a column.<code gnuplot> 
-plot prev=-9999, "idSlamDala.dat" using 1:(dt=(prev==-9999?0:$2-prev), prev=$2, dt) +t0=0 
 +deltat(t)=((t0<=1)?(t0=t,0):(t-t0)) 
 +plot "idSlamDala.dat" using (deltat($1)):
 +</code> 
 +    * Using difference of two consecutive lines of the same column.<code gnuplot> 
 +plot prev=-9999, "idSlamDala.dat" using 1:(dt=(prev==-9999?0/0:$2-prev), prev=$2, dt)  
 +</code> 
 +    * Making an angle continuous.<code gnuplot> 
 +k=0 
 +prev_a=0 
 +continuous(a)=((prev_a>pi/2&&a<-pi/2 ? k=k+1 : (prev_a<-pi/2&&a>pi/2 ? k=k-1 : k)), prev_a=a, a+k*2*pi) 
 +</code> 
 +    * You may also use ''awk'' to have a more explicit program, but it won't automatically ignore comment lines:<code gnuplot> 
 +plot "< awk '{sum=sum+$2; print sum,$6}' idSlamDala.dat" using 1:2
 plot "< awk 'NR==1 { prev=$2 } NR>1 { dt=$2-prev; prev=$2; print $1,dt; }' idSlamDala.dat" using 1:2 plot "< awk 'NR==1 { prev=$2 } NR>1 { dt=$2-prev; prev=$2; print $1,dt; }' idSlamDala.dat" using 1:2
 +</code>
 +    * Bins mean + eval.<code gnuplot>
 +myplot(x,t) = sprintf("plot \"< awk '\
 +    NR==1 { i=0; s=0; for(j=0;j<$ARGV_NMEAN;j++) tab[j]=0; } \
 +    NR>=1 { s=s-tab[i]; tab[i]=\$%d; s=s+tab[i]; i=(i>=($ARGV_NMEAN-1)?0:i+1); } \
 +    NR>$ARGV_NMEAN { if (i==0) print s/$ARGV_NMEAN; }' $ARGV_FILE\"\
 +    using 1 t \"%s\"", x, t)
 +eval myplot(2, "ax")
 +</code>
 +    * Sliding mean + continous angle + gunzip.<code gnuplot>
 +plot "< gunzip -c $ARGV_FILE | awk '\
 +    NR==1 { k=0; prev_a=0; i=0; pi=3.14159265358979 } \
 +    NR>=1 { a=\$2; k=(prev_a>pi/2 && a<-pi/2 ? k+1 : (prev_a<-pi/2 && a>pi/2 ? k-1 : k)); prev_a=a; a=a+k*2*pi; t=\$1; taba[i]=a; tabt[i]=t; i=(i>=($ARGV_NMEAN-1)?0:i+1); } \
 +    NR>$ARGV_NMEAN { bias=(a-taba[i])/((t-tabt[i])/3600); print t,bias; }' "\
 +    using (deltat(\$1)/3600):(\$2*180/pi) with points pt 0 lt rgb "red"  title "bias"
 </code> </code>
  
-  * **paste** Make operations with different files. Not possible with gnuplot, but ''paste'' can help+  * **paste** Plotting one curve with values from different files. Not possible with gnuplot, but ''paste'' can help.<code gnuplot>
-    * Plotting one curve with values from different files.<code gnuplot>+
 plot "< paste file1.dat file2.dat" using 1:($4-$2) plot "< paste file1.dat file2.dat" using 1:($4-$2)
 </code> </code>
Line 221: Line 299:
   * **gunzip** Use file compressed with gzip. Not possible with gnuplot, but ''gunzip'' can help.<code gnuplot>   * **gunzip** Use file compressed with gzip. Not possible with gnuplot, but ''gunzip'' can help.<code gnuplot>
 plot "< gunzip -c file.dat" using 1:($4-$2) plot "< gunzip -c file.dat" using 1:($4-$2)
 +plot "< zcat file.dat" using 1:($4-$2)
 +plot "< tar -Oxjf file.dat.tar.bz2" using 1:($4-$2)
 </code> </code>
  
   * or anything else with shell commands...   * or anything else with shell commands...
 +
 +  * **fit** a function to data:<code gnuplot>
 +f(x) = a*x**2 + b*x + c
 +fit f(x) "file.dat" u 1:2 via a,b,c
 +plot "file.dat" u 1:2, f(x)
 +</code>
  
   * **sh** Passing arguments to a gnuplot script.   * **sh** Passing arguments to a gnuplot script.
-    * Putting the gnuplot commands in a shell script:<code gnuplot|plot.gp>+    * (preferred method) Putting the gnuplot commands in a shell script (be careful, if you forget a backslash in front of a gnuplot dollar the error message can seem mysterious):<code gnuplot|plot.gp>
 #!/bin/sh #!/bin/sh
 ARGV1=$1 ARGV1=$1
Line 234: Line 320:
 </code><code sh> </code><code sh>
 ./plot.gp run.dat ./plot.gp run.dat
 +</code>You can also build a more complicated plot file with multiple steps (for multiplot or multiple curves):<code gnuplot>
 +#!/bin/sh
 +######
 +script_header=`cat<<EOF
 +set term wxt size 1024,768
 +set grid
 +plot \
 +EOF
 +`
 +script=$script_header
 +######
 +for host in $*; do
 +script_loop=`cat<<EOF
 +    "file_$host.log" u 4:5 w l lt rgb "blue" t "Position $host", \
 +EOF
 +`
 +script="$script$script_loop"
 +done
 +######
 +script_footer=`cat<<EOF
 +
 +pause -1
 +EOF
 +`
 +script="$script$script_footer"
 +
 +gnuplot<<EOF
 +$(echo "$script")
 +EOF
 </code> </code>
-    * Writing a generic launcher script with environment variables:<code sh|gplaunch>+    * Writing a generic launcher script with environment variables (but difficulty to deal with relative paths):<code sh|gplaunch>
 #!/bin/sh #!/bin/sh
 export ARGV1=$2; export ARGV2=$3; export ARGV3=$4; export ARGV4=$5; export ARGV1=$2; export ARGV2=$3; export ARGV3=$4; export ARGV4=$5;
Line 247: Line 362:
 ./plot.gp run.dat # if gplaunch is installed on the system ./plot.gp run.dat # if gplaunch is installed on the system
 </code> </code>
-    * Writing a generic launcher script with ''sed'':<code sh|gplaunch>+    * Writing a generic launcher script with ''sed'' (but difficulty to deal with relative paths):<code sh|gplaunch>
 #!/bin/sh #!/bin/sh
 cat $1 | sed "s/\$ARGV1/$2/g" | sed "s/\$ARGV2/$3/g" | sed "s/\$ARGV3/$4/g" | sed "s/\$ARGV4/$5/g" | gnuplot cat $1 | sed "s/\$ARGV1/$2/g" | sed "s/\$ARGV2/$3/g" | sed "s/\$ARGV3/$4/g" | sed "s/\$ARGV4/$5/g" | gnuplot
Line 272: Line 387:
 !epstopdf --outfile=plot.pdf plot.eps !epstopdf --outfile=plot.pdf plot.eps
 quit quit
-</code>By default, when exporting to ps or pdf, gnuplot changes the lines style with dashes so that they can be recognized when printed in black and white. If you want to keep your lines plain, you can add the "linestyle 1" command:<code gnuplot> +</code>By default, when exporting to ps or pdf, gnuplot changes the lines style with dashes so that they can be recognized when printed in black and white. If you want to keep your lines plain, you can either add the "solid" option to the terminal command, or add the "ls 1" command:<code gnuplot> 
-plot [...] with lines linestyle 1 lt rgb "red"+plot [...] with lines ls lw 2 lt rgb "red
 +</code>Also the grid is black by default, if you want to set it to grey:<code gnuplot> 
 +set grid lc rgb "grey"
 </code> </code>
  
Line 282: Line 399:
 # your plotting code (can be included using the load command) # your plotting code (can be included using the load command)
  
 +quit
 +</code>If you need dashes but want raster PNG output (eg because the eps would be too large), you can use the eps terminal and convert the file to png at the end with imagemagick:<code gnuplot>
 +set output
 +!convert -density 600x600 -background white -flatten plot.eps plot.png
 +quit
 +</code>When converting eps to png, convert creates a png with non visible alpha data even if flatten, and some viewers like ''evince'' fail to antialias them. So you have to convert it twice:<code gnuplot>
 +set output
 +!convert -density 600x600 -background white -flatten plot.eps ppm:- | convert - plot.png
 quit quit
 </code> </code>
- 
   * SVG:<code gnuplot>   * SVG:<code gnuplot>
 set terminal svg rounded size 450,360 set terminal svg rounded size 450,360
Line 294: Line 418:
 !gzip -S z plot.svg !gzip -S z plot.svg
 quit quit
 +</code>
 +
 +
 +
 +  * Conditional output:<code gnuplot>
 +#!/bin/sh
 +
 +TITLE=plot
 +if [[ $1 == "pdf" ]]; then
 +    GTERM='set terminal postscript eps color "Times-Roman" 16 solid size 5,2.9 ; set output "$TITLE.eps"'
 +    OUTPUT='!epstopdf --outfile=$TITLE.pdf $TITLE.eps'
 +    GRIDCOLOR='lc rgb "grey"'
 +    shift
 +elif [[ $1 == "png" ]]; then
 +    GTERM='set terminal pngcairo font "Times,32" size 1830,1780 ; set output "$TITLE.png"'
 +    OUTPUT=''
 +    GRIDCOLOR=''
 +    shift
 +else
 +    GTERM='set term wxt size 1024,768'
 +    OUTPUT=''
 +    GRIDCOLOR=''
 +fi
 +
 +gnuplot -persist << EOF
 +
 +$GTERM
 +set grid $GRIDCOLOR
 +
 +# your plotting code (can be included using the load command)
 +
 +set output
 +    $OUTPUT
 +    
 +EOF
 +</code>
 +
 +===== Interactivity =====
 +
 +  * Keyboard bindings<code gnuplot>
 +bind "a" "plot x*x"
 +</code>
 +
 +  * Progressive display (but the plot is not interactive anymore)<code gnuplot>
 +plot "file.dat" u 1
 +while(1) { replot ; pause 0.2 }
 +</code>
 +
 +  * Pausing and resuming the progressive display for interactivity (only works with x11 terminal if started in interactive gnuplot shell... for wxt terminal the event processing loop -- wxt_gui.cpp:wxt_waitforinput function -- is not called during the update loop, but ctrl-c in the shell stops the update loop and allows plot interactivity afterwards, contrary to x11 term...).<code gnuplot>
 +set terminal x11
 +bind "c" "update=1-update ; while(update) { replot ; pause 0.1 }"
 +plot "file.dat" u 1
 +update=1
 +while(update) { replot ; pause 0.2 }
 </code> </code>
  
software/gnuplot.1299708815.txt.gz · Last modified: 2013/09/19 16:43 (external edit)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0