*! version 3.11 am 1Jul98 STB-45 gr31 program define grlexis2 version 5.0 local varlist "req ex min(3) max(3)" local if "opt" local options "UPdate(string) EVent(string) SAVING(string) XLAB(string) YLAB(string) LTitle(string) BTitle(string) TItle(string) SYMBol(string) NOLINES Box(string) Nograph(int 1) NOISE NUMBERS" parse "`*'" parse "`varlist'", parse(" ") tempvar total total1 local timein `1' local fail `2' local fup `3' qui drop if `timein'==. if "`if'"~="" { preserve drop if `timein'==. keep `if' } qui gen `total'=`timein'+`fup' if "`update'"~="" { qui replace `update'= cond(`update'==.,0,`update'[_n]) qui gen `total1'=`update'+`fup' } /* Set up graph box variables leftx rightx topy ------------------------- | | | | height | | | | | | | | boty ------------------------- <- width -> */ global max_by=23063 global max_rx=32000 global topy=2000 global boty=21000 global leftx=2500 global rightx=30000 global width=$rightx-$leftx global height=$boty-$topy if "`box'" ~= "" { parse "`box'", parse(",") if(`1'<2000) { di "WARNING Bounding box wrong top y `1'<2000" exit(666) } if(`3'>21000) { di "WARNING Bounding box wrong bottom y `3'>21000" exit(666) } if(`5'<2500) { di "WARNING Bounding box wrong left x `5'<2500" exit(666) } if(`7'>30000) { di "WARNING Bounding box wrong right x `7'>30000" exit(666) } if(`1'>=`3' | `5'>=`7') { di "WARNING Bounding box wrong Is `1'>=`3'? OR is `5'>=`7'?" exit(666) } else { global topy=`1' global boty=`3' global leftx=`5' global rightx=`7' global width=$rightx-$leftx global height=$boty-$topy } } * Calculate the equivalent data variables qui summ `timein' local miny = _result(5) qui summ `total' local maxy = _result(6) if "`update'"=="" { qui summ `fup' local maxx=_result(6) global dleftx=0 } else { qui summ `total1' local maxx=_result(6) qui summ `update' local minx=_result(5) global dleftx=`minx' } global drightx=`maxx' global dtopy=`maxy' global dboty=`miny' if "`xlab'" ~= "" { parse "`xlab'", parse(",") macno `xlab' , local xlabn = $macn parse "`xlab'", parse(",") cap confirm number `$last' if _rc==0 { if `$last' > $drightx { global drightx=`$last' } } else { di in red "WARNING error in xlab" confirm number `$last' } if `1' < $dleftx { global dleftx=`1' } } else { local xlabn=2 } if "`ylab'" ~= "" { parse "`ylab'", parse(",") macno `ylab' , local ylabn = $macn parse "`ylab'", parse(",") if `$last' > $dtopy { global dtopy=`$last' } if `1' < $dboty { global dboty=`1' } } else { local ylabn=2 } global dwidth=$drightx-$dleftx global dheight=$dtopy-$dboty if "`noise'"~="" { di "Data top left = $dleftx,$dtopy" di "Data bot right = $drightx,$dboty" } * Plotting symbols if "`symbol'"~="" { parse "`symbol'", parse(",") local symb1 = `1' } if ("`saving'"~="") { cap confirm new file `saing'.gph if _rc==0 { di "Deleteing file...`saving'.gph" !rm `saving'.gph } di "Saving file... `saving'.gph" gph open, saving(`saving') } else { gph open } gph pen 2 * Draw axes and title gph line $boty $leftx $boty $rightx gph line $boty $leftx $topy $leftx local xpt=$leftx+$width/2 local ypt=$topy-1000 if "`title'"=="" { gph text `ypt' `xpt' 0 0 LEXIS Diagram } else { gph text `ypt' `xpt' 0 0 `title' } * Ticks and labels if "`xlab'"~="" { cxaxes2 `xlab' , } else { cxaxes `timein' `fup' local xlabn=2 } if "`ylab'"~="" { cyaxes2 `ylab' , } else { cyaxes `timein' total local ylabn=2 } *Draw X-axis and draw ticks and text local i=1 while `i'<=`xlabn' { local t1=xaxes[`i',1] local t2=xaxes[`i',2] local t3=xaxes[`i',3] local t4=xaxes[`i',4] gph line `t2' `t1' `t3' `t1' local t1=`t1'-100 local t3=`t3'+600 gph text `t3' `t1' 0 0 `t4' local i=`i'+1 } *XY-axis Titles local xpt = $leftx+$width/2 local ypt = $boty + 2000 if "`btitle'"=="" { gph text `ypt' `xpt' 0 0 (`fup') Follow-up } else { gph text `ypt' `xpt' 0 0 `btitle' } local xpt = $leftx - 300 local ypt = $topy - 1000 if "`ltitle'"=="" { gph text `ypt' `xpt' 0 0 (`timein') Time in } else { gph text `ypt' `xpt' 0 0 `ltitle' } *Draw Y-axis and ticks and text local i=1 while `i'<=`ylabn' { local t1=yaxes[`i',1] local t2=yaxes[`i',2] local t3=yaxes[`i',3] local t4=yaxes[`i',4] gph line `t1' `t2' `t1' `t3' local t3=`t3'-1000 local t1=`t1'+270 if `t4' > 1000 { local t3=`t3'-350 } gph text `t1' `t3' 0 0 `t4' local i=`i'+1 } * Drawing the lines local i=1 while (`i'<=_N) { gph pen 3 if "`update'"=="" { local x1=$leftx local x2=(`fup'[`i']-$dleftx)/$dwidth*$width+$leftx } else { local x1=(`update'[`i']-$dleftx)/$dwidth*$width+$leftx local x2=(`fup'[`i']+`update'[`i']-$dleftx)/$dwidth*$width+$leftx } local y1=$boty-((`timein'[`i']-$dboty)/$dheight*$height) local y2=$boty-((`fup'[`i']+`timein'[`i']-$dboty)/$dheight*$height) if "`nolines'" =="" { if (`y1' <= $max_by & `y2'<= $max_by & `x2' <=$max_rx & `x1' <=$max_rx `y1'>=0 & `y2'>=0 & `x2'>=0 & `x1'>=0) { gph line `y1' `x1' `y2' `x2' } else { di in red "`y1' `y2' `x1' `x2' `i'" } } local i=`i'+1 } * Drawing points * it is after the lines as the lines overwrite symbols. local i=1 while (`i'<=_N) { gph pen 4 if "`event'"=="" { if "`update'"=="" { local x2=(`fup'[`i']-$dleftx)/$dwidth*$width+$leftx local y2=$boty-((`fup'[`i']+`timein'[`i']-$dboty)/$dheight*$height) } else { local x2=(`fup'[`i']+`update'[`i']-$dleftx)/$dwidth*$width+$leftx local y2=$boty-((`fup'[`i']+`timein'[`i']-$dboty)/$dheight*$height) /* local fupc=`fup'[`i'] local updc=`update'[`i'] local timc=`timein'[`i'] gph text 10000 5000 0 0 x2 `x2' `fupc' `updc' gph text 12000 5000 0 0 y2 `y2' */ } } else { local x2=(`event'[`i']-$dleftx)/$dwidth*$width+$leftx local y2=$boty-((`event'[`i']-`update'[`i']+`timein'[`i']-$dboty)/$dheight*$height) } * check out plotting symbols qui inspect `fail' if _result(7)>2 { if `fail'[`i']~=0 { if (`y2'<= $max_by & `x2' <=$max_rx & `y2'>=0 & `x2'>=0) { local symbols= mod(`fail'[`i'],6) local pens=mod(`symbols',6) gph pen `pens' gph point `y2' `x2' 100 `symbols' } } else { if "`nolines'"~="" { gph point `y2' `x2' 100 6 } else { gph point `y2' `x2' 100 0 } } } else { if `fail'[`i']==1 { if "`symbol'"~="" { gph point `y2' `x2' 100 `symb1' } else { if (`y2'<= $max_by & `x2' <=$max_rx & `y2'>=0 & `x2'>=0) { gph point `y2' `x2' 100 4 } } } else { if "`nolines'"~="" { gph point `y2' `x2' 100 6 } else { gph point `y2' `x2' 100 0 } } } if "`numbers'"~="" { local x2=`x2'+500 gph text `y2' `x2' 0 0 `i' if `i'==1 { mat numb=J(1,1,0) } matrix numb[1,1]= `i' } local i=`i'+1 } gph close if "`if'"~="" { restore } end program define cxaxes local length=400 local min=$dleftx local max=$drightx matrix xaxes= J(2,4,0) matrix xaxes[1,1] = (`min'-`min')/(`max'-`min')*$width+$leftx matrix xaxes[2,1] = (`max'-`min')/(`max'-`min')*$width+$leftx matrix xaxes[1,2] = $boty matrix xaxes[2,2] = $boty matrix xaxes[1,3] = $boty+`length' matrix xaxes[2,3] = $boty+`length' matrix xaxes[1,4] = round(`min',0.1) matrix xaxes[2,4] = round(`max',0.1) end program define cyaxes local length=400 local min=$dboty local max=$dtopy matrix yaxes= J(2,4,0) matrix yaxes[1,1] = $boty matrix yaxes[2,1] = $boty-$height matrix yaxes[1,2] = $leftx matrix yaxes[2,2] = $leftx matrix yaxes[1,3] = $leftx-`length' matrix yaxes[2,3] = $leftx-`length' matrix yaxes[1,4] =round( $dboty,0.1) matrix yaxes[2,4] =round( $dtopy,0.1) end program define cxaxes2 local length=400 macno `1' `2' matrix xaxes= J($macn,4,0) local i=1 parse "`1'", parse("`2'") while "`1'"~="" { matrix xaxes[`i',1] = round((`1'-$dleftx)/$dwidth*$width+$leftx,1) matrix xaxes[`i',2] = $boty matrix xaxes[`i',3] = $boty+`length' matrix xaxes[`i',4] = `1' mac shift 2 local i=`i'+1 } end program define cyaxes2 local length=400 macno `1' `2' matrix yaxes= J($macn,4,0) local i=1 parse "`1'", parse("`2'") while "`1'"~="" { matrix yaxes[`i',1] = round(($dboty-`1')/$dheight*$height+$boty,1) matrix yaxes[`i',2] = $leftx matrix yaxes[`i',3] = $leftx-`length' matrix yaxes[`i',4] = `1' mac shift 2 local i=`i'+1 } end program define modula global S_1 = round(`1'*(`2'/`1'-int(`2'/`1')),1) end program define macno global macn=0 global last=0 local tmp_str = "" local tmp_str "`2'" parse "`1'", parse("`2'") while "`1'"~="" { while "`1'"=="`tmp_str'" { mac shift global last = $last+1 } global macn = $macn+1 mac shift global last= $last+1 } end