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:04, 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.)