*! version 1.0.1 PR 22Nov1996 STB-34 gr21 program define tgraph version 4.0 local varlist "req ex min(1)" local in "opt" local if "opt" #delimit ; local options "XTrans(string) YTrans(string) XLAbel(string) YLAbel(string) *" ; #delimit cr parse "`*'" if "`xtrans'"=="" & "`ytrans'"=="" { di in red "either xtrans or ytrans required" exit 198 } if "`xtrans'"!="" & "`xlabel'"=="" { di in red "xlabel required with xtrans" exit 198 } if "`ytrans'"!="" & "`ylabel'"=="" { di in red "ylabel required with ytrans" exit 198 } * Determine min and max of the yvars parse "`varlist'", parse(" ") local nvar: word count `varlist' local big 1e29 local min `big' local max -`big' local i 1 while `i'<`nvar' { if "`ytrans'"!="" { local oldy`i' `1' tempvar y`i' qui sum `1' `if' `in' local min=min(`min',_result(5)) local max=max(`max',_result(6)) local yvars "`yvars' `y`i''" } else { local yvars "`yvars' `1'" } local i=`i'+1 mac shift } local xvar `*' * Transform yvars qui if "`ytrans'"!="" { tempname tmpylab local i 1 while `i'<`nvar' { axiscale `y`i''=`oldy`i'' `if' `in', min(`min') max(`max') /* */ label(`ylabel') function("`ytrans'") valuelab(`tmpylab') local i=`i'+1 } local ylabel $S_1 } * Transform xvar qui if "`xtrans'"!="" { tempname tmpxlab tempvar x axiscale `x'=`xvar' `if' `in', /* */ label(`xlabel') function("`xtrans'") valuelab(`tmpxlab') local xlabel $S_1 } else { local x `xvar' } if "`xlabel'"!="" { local xl "xlabel(`xlabel')" } if "`ylabel'"!="" { local yl "ylabel(`ylabel')" } graph `yvars' `x' `if' `in', `xl' `yl' `options' end *! version 1.2.0 PR 19Nov96. program define axiscale version 4.0 local varlist "req new max(1)" local exp "req noprefix" local if "opt" local in "opt" #delimit ; local options "Labels(string) Function(string) MIN(string) MAX(string) Valuelab(string)" ; #delimit cr tempvar x labs newlabs new parse "`*'" if "`labels'"=="" | "`functio'"=="" { di in red "labels() and function() must be supplied" exit 198 } if "`min'"!="" { conf num `min' } else local min . if "`max'"!="" { conf num `max' } else local max . if "`valuela'"=="" { local valuela _LAB } * Find min and max of oldvar quietly { gen `x'=`exp' `if' `in' sum `x' if `min'==. { local min=_result(5) } else if `min'>_result(5) { noi di in red "invalid min(), `min'> min(`exp')" exit 198 } if `max'==. { local max=_result(6) } else if `max'<_result(6) { noi di in red "invalid max(), `max' < max(`exp')" exit 198 } * Convert labels to a var, including min and max gen `labs'=. parse "`labels',`min',`max'", parse(",") local nlab 0 while "`1'"!="" { if "`1'"!="," { conf num `1' local nlab=`nlab'+1 local lab`nlab' `1' /* store label as string */ replace `labs'=`1' in `nlab' } mac shift } * Update min and max for consistency with labels sum `labs' if `min'>_result(5) { local nlab1=`nlab'-1 local min=_result(5) replace `labs'=`min' in `nlab1' } if `max'<_result(6) { local max=_result(6) replace `labs'=`max' in `nlab' } * Transform labels parse "`functio'", parse("@[]") local f while "`1'"!="" { if "`1'"=="@" { local 1 `labs' } else if "`1'"=="[" { local 1 "(" } else if "`1'"=="]" { local 1 ")" } local f "`f'`1'" mac shift } cap replace `labs'=`f' local rc=_rc if `rc' { noisily error `rc' } local tmin=`labs'[`nlab'-1] local tmax=`labs'[`nlab'] if `tmin'>`tmax' { local temp `tmin' local tmin `tmax' local tmax `temp' } * Transform oldvar parse "`functio'", parse("@[]") local f while "`1'"!="" { if "`1'"=="@" { local 1 `x' } else if "`1'"=="[" { local 1 "(" } else if "`1'"=="]" { local 1 ")" } local f "`f'`1'" mac shift } cap replace `x'=`f' local rc=_rc if `rc' { noisily error `rc' } * Transform transformed oldvar to integer scale gen int `new'=. rescale `new' `x' `tmin' `tmax' /* tmin->0, tmax->1000 */ * Do same to labels gen int `newlabs'=. rescale `newlabs' `labs' `tmin' `tmax' * Convert newlabs to string local xxl /* string of new labels */ cap lab drop `valuela' local i 0 while `i'<`nlab'-2 { local i=`i'+1 local xx=`newlabs'[`i'] if "`xxl'"=="" { local xxl `xx' } else local xxl "`xxl',`xx'" lab def `valuela' `xx' "`lab`i''",add } replace `varlist'=`new' lab values `varlist' `valuela' lab var `varlist' "`exp', transformed scale" } describe `varlist' global S_1 `xxl' global S_NJC `xxl' end program define rescale /* newintvar oldtsfvar tsfmin tsfmax */ replace `1'=int(1000*(`2'-`3')/(`4'-`3')+.5) end