Difference between revisions of "GMT Scatterplot"
From assela Pathirana
Jump to navigationJump to search
Line 2: | Line 2: | ||
;Note: | ;Note: | ||
{{GMT_program_notes}} | {{GMT_program_notes}} | ||
==Script== | |||
filename: x-y.bash | |||
<pre> | |||
#!/bin/bash | |||
# (c) 2006, Assela Pathirana under GNU GPL 2.0 (http://www.gnu.org/copyleft/gpl.html) | |||
############# | |||
#Do some input checking and help out the first time users | |||
sourcef="$1.txt" | |||
if [[ $# -lt 1 ]] | |||
then | |||
echo 'to create a scattergram from the datafile named <arg1>''.txt'' and to save it in <arg1>.eps' | |||
echo "The data file <arg1>.txt should have the data in two columns, seperated by commas. The first line of input should be the axes titles, not data. " | |||
echo 'first run with only \<arg1> as file name. ' | |||
echo "Then after seeing the range of data to plot - run with all five arguments <arg1> <dx> <dy>" | |||
exit 1 | |||
else | |||
if [[ ! -f "$sourcef" ]]; then | |||
echo "There is no file named $sourcef (did you forget to give filename witout .txt part?) " | |||
exit 1 | |||
fi | |||
fi | |||
if [ $# -ge 3 ] | |||
then | |||
ytitle=`head -n1 $sourcef |awk 'BEGIN{FS=","}{print $2}'` | |||
xtitle=`head -n1 $sourcef |awk 'BEGIN{FS=","}{print $1}'` | |||
inilt=-I$2/$3 | |||
b="a$2f$2g$2:$xtitle:/a$3f$3g$3:$ytitle:WSne" | |||
echo "using -B option: "$b | |||
else | |||
if [ $# -eq 1 ] | |||
then | |||
inilt=-I1E-15/1E-15 | |||
b="a1f1g1WSne" | |||
else | |||
#now we are in a strange position. | |||
echo "Either give one argument or all five! I quit. " | |||
exit 1 | |||
fi | |||
fi | |||
#Simple check for gmt commands | |||
if [[ ! -f "$GMTHOME/bin/gmtset" ]] ; then | |||
echo "no GMT environment present. Install GMT and set paths properly before running this script" | |||
exit 1 | |||
fi | |||
#We are In business | |||
#clear any garbage from prvious gmt runs/attempts | |||
rm -f .gmtcommands* .gmtdefaults* | |||
#set some constants | |||
gmtset LABEL_FONT_SIZE 18 | |||
outf="$1.eps" | |||
trcol="1pt/255/0/0" | |||
bicol="1pt3_3:0/0/0/255" | |||
symcol="255/0/0" | |||
symsym="C.4c" | |||
trendfile="$1.tr.txt" | |||
# calculate a linear(N2) fit for the datafile who has one header rows. Write only | |||
trend1d $sourcef -N2 -Fxmy -H1 |sort -bg > $trendfile | |||
# calculate the coefficient of determination | |||
ybar=`cat $trendfile |awk '{ya=ya+$3;ct++}END{print ya/ct}'` | |||
CD=`cat $trendfile |awk -v ybar=$ybar '{ymb=ymb+($3-ybar)^2;ymh=ymh+($3-$2)^2;ct++}END{printf "%4.2f", (ymb-ymh)/ymb}'` | |||
#find a plotting range | |||
minmax $sourcef -H1 $inilt -C > $$ | |||
xmin=`awk -v dd=$2 '{print $1-dd}' $$` | |||
ymin=`awk -v dd=$3 '{print $3-dd}' $$` | |||
xmax=`awk -v dd=$2 '{print $2+dd}' $$` | |||
ymax=`awk -v dd=$3 '{print $4+dd}' $$` | |||
\rm -f $$ | |||
range='-R'$xmin'/'$xmax'/'$ymin'/'$ymax'/' | |||
echo "Using the range : $range" | |||
echo "now plotting ..." | |||
psxy -H1 $sourcef $range -W.5p/0/0/0 -G$symcol -S$symsym -JX10c -B"$b" -P -K > $outf | |||
psxy -H1 $trendfile $range -W1.5p/$trcol -JX10c -B"$b" -P -O -K >> $outf | |||
#legend | |||
psxy -R0/1/0/1 -JX -O -K -G240 -L -W.75p << END >> $outf | |||
.055 .955 | |||
.405 .955 | |||
.405 .705 | |||
.055 .705 | |||
END | |||
echo "0.09 0.90" | psxy -R -JX -O -K -S$symsym -G$symcol -W.5p/0/0/0 >> $outf | |||
echo "0.16 0.90 14 0.0 1 5 Values" | pstext -R -JX -O -K >> $outf | |||
psxy -R -JX -O -K -W$trcol -G0 <<END >>$outf | |||
0.07 0.84 | |||
0.14 0.84 | |||
END | |||
echo "0.16 0.84 14 0.0 1 5 Trend" | pstext -R -JX -O -K >> $outf | |||
psxy -R0/1/0/1 -JX -O -K -G240 -L -W.75p << END >> $outf | |||
.96 .06 | |||
.96 .21 | |||
.61 .21 | |||
.61 .06 | |||
END | |||
echo "0.65 0.135 14 0.0 1 5 C.D.= $CD" | pstext -R -JX -O >> $outf | |||
#echo "0.16 0.78 14 0.0 1 5 `head -n1 $sourcef|awk 'BEGIN{FS=","};{print $1}'` " | pstext -R -JX -O >> $outf | |||
#clean up | |||
\rm -f .gmt* $$ $$.* | |||
</pre> | |||
==Test Data== | |||
filename: sample.data.txt | |||
<pre> | |||
x data title , y data title | |||
-10.681 , -4.14932696 | |||
-8.292 , -0.665670484 | |||
-25.482 , -3.775538869 | |||
-24.293 , -0.315713513 | |||
-36.929 , -4.215689714 | |||
-42.547 , -2.864580275 | |||
-49.196 , -8.841218073 | |||
-54.941 , -4.88540979 | |||
-63.0095 , -10.46740317 | |||
-69.0207 , -8.121834461 | |||
</pre> | |||
==How to Run== | |||
{{how_to_run_bash_script}} |
Revision as of 06:03, 23 March 2006
This script can be used to draw a mediawiki:Scatterplot using data provided in a comma seperated text file.
- Note
-
- You need the following to run a GMT program successfully
-
- Install GMT
- A UNIX like environment with standard programs like awk and sed. If you use Linux you are already set. If you use windows Install Cygwin -- it's very simple to do this.
- You need the following to use the Postscript output of GMT
-
- Free utility to view Postscript files -- Ghostview or GSview.
Script
filename: x-y.bash
#!/bin/bash # (c) 2006, Assela Pathirana under GNU GPL 2.0 (http://www.gnu.org/copyleft/gpl.html) ############# #Do some input checking and help out the first time users sourcef="$1.txt" if [[ $# -lt 1 ]] then echo 'to create a scattergram from the datafile named <arg1>''.txt'' and to save it in <arg1>.eps' echo "The data file <arg1>.txt should have the data in two columns, seperated by commas. The first line of input should be the axes titles, not data. " echo 'first run with only \<arg1> as file name. ' echo "Then after seeing the range of data to plot - run with all five arguments <arg1> <dx> <dy>" exit 1 else if [[ ! -f "$sourcef" ]]; then echo "There is no file named $sourcef (did you forget to give filename witout .txt part?) " exit 1 fi fi if [ $# -ge 3 ] then ytitle=`head -n1 $sourcef |awk 'BEGIN{FS=","}{print $2}'` xtitle=`head -n1 $sourcef |awk 'BEGIN{FS=","}{print $1}'` inilt=-I$2/$3 b="a$2f$2g$2:$xtitle:/a$3f$3g$3:$ytitle:WSne" echo "using -B option: "$b else if [ $# -eq 1 ] then inilt=-I1E-15/1E-15 b="a1f1g1WSne" else #now we are in a strange position. echo "Either give one argument or all five! I quit. " exit 1 fi fi #Simple check for gmt commands if [[ ! -f "$GMTHOME/bin/gmtset" ]] ; then echo "no GMT environment present. Install GMT and set paths properly before running this script" exit 1 fi #We are In business #clear any garbage from prvious gmt runs/attempts rm -f .gmtcommands* .gmtdefaults* #set some constants gmtset LABEL_FONT_SIZE 18 outf="$1.eps" trcol="1pt/255/0/0" bicol="1pt3_3:0/0/0/255" symcol="255/0/0" symsym="C.4c" trendfile="$1.tr.txt" # calculate a linear(N2) fit for the datafile who has one header rows. Write only trend1d $sourcef -N2 -Fxmy -H1 |sort -bg > $trendfile # calculate the coefficient of determination ybar=`cat $trendfile |awk '{ya=ya+$3;ct++}END{print ya/ct}'` CD=`cat $trendfile |awk -v ybar=$ybar '{ymb=ymb+($3-ybar)^2;ymh=ymh+($3-$2)^2;ct++}END{printf "%4.2f", (ymb-ymh)/ymb}'` #find a plotting range minmax $sourcef -H1 $inilt -C > $$ xmin=`awk -v dd=$2 '{print $1-dd}' $$` ymin=`awk -v dd=$3 '{print $3-dd}' $$` xmax=`awk -v dd=$2 '{print $2+dd}' $$` ymax=`awk -v dd=$3 '{print $4+dd}' $$` \rm -f $$ range='-R'$xmin'/'$xmax'/'$ymin'/'$ymax'/' echo "Using the range : $range" echo "now plotting ..." psxy -H1 $sourcef $range -W.5p/0/0/0 -G$symcol -S$symsym -JX10c -B"$b" -P -K > $outf psxy -H1 $trendfile $range -W1.5p/$trcol -JX10c -B"$b" -P -O -K >> $outf #legend psxy -R0/1/0/1 -JX -O -K -G240 -L -W.75p << END >> $outf .055 .955 .405 .955 .405 .705 .055 .705 END echo "0.09 0.90" | psxy -R -JX -O -K -S$symsym -G$symcol -W.5p/0/0/0 >> $outf echo "0.16 0.90 14 0.0 1 5 Values" | pstext -R -JX -O -K >> $outf psxy -R -JX -O -K -W$trcol -G0 <<END >>$outf 0.07 0.84 0.14 0.84 END echo "0.16 0.84 14 0.0 1 5 Trend" | pstext -R -JX -O -K >> $outf psxy -R0/1/0/1 -JX -O -K -G240 -L -W.75p << END >> $outf .96 .06 .96 .21 .61 .21 .61 .06 END echo "0.65 0.135 14 0.0 1 5 C.D.= $CD" | pstext -R -JX -O >> $outf #echo "0.16 0.78 14 0.0 1 5 `head -n1 $sourcef|awk 'BEGIN{FS=","};{print $1}'` " | pstext -R -JX -O >> $outf #clean up \rm -f .gmt* $$ $$.*
Test Data
filename: sample.data.txt
x data title , y data title -10.681 , -4.14932696 -8.292 , -0.665670484 -25.482 , -3.775538869 -24.293 , -0.315713513 -36.929 , -4.215689714 -42.547 , -2.864580275 -49.196 , -8.841218073 -54.941 , -4.88540979 -63.0095 , -10.46740317 -69.0207 , -8.121834461
How to Run
In a UNIX environment (which includes Cygwin and Linux), the user need to have executable permissions on a file to run it. (Here is a UNIX filesystem permissoins tutorial.)