You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.4 KiB
Plaintext
139 lines
3.4 KiB
Plaintext
*! version 1.1.0 11/4/94 (STB-25: dm28)
|
|
program define nicenum
|
|
version 4.0
|
|
local mac "`1'"
|
|
if "`2'" != "=" {
|
|
di in red /*
|
|
*/ "nicenum macroname = arglist [if expr] [in range], Number(#)"
|
|
error 198
|
|
}
|
|
mac shift 2
|
|
local remain "`*'"
|
|
parse "`*'", parse(",")
|
|
local arglist "`1'"
|
|
local opts "`3'"
|
|
|
|
parse "`arglist'", parse(" ")
|
|
while "`1'" != "" & "`1'" != "if" & "`1'" != "in" {
|
|
capture confirm var `1'
|
|
if _rc != 0 {
|
|
local numlist "`numlist' `1'"
|
|
}
|
|
else { local varlist "`varlist' `1'" }
|
|
mac shift
|
|
}
|
|
tempvar use
|
|
mark `use' `*'
|
|
markout `use' `varlist'
|
|
|
|
tempname gmin gmax
|
|
scalar `gmin' = . /* uninitialized state */
|
|
scalar `gmax' = .
|
|
if "`varlist'" != "" {
|
|
parse "`varlist'", parse(" ")
|
|
quietly summ `1' if `use'
|
|
scalar `gmin' = _result(5)
|
|
scalar `gmax' = _result(6)
|
|
mac shift
|
|
while "`1'" != "" {
|
|
quietly summ `1' if `use'
|
|
scalar `gmin'=cond(_result(5)<`gmin',_result(5),`gmin')
|
|
scalar `gmax'=cond(_result(6)>`gmax',_result(6),`gmax')
|
|
mac shift
|
|
}
|
|
}
|
|
|
|
parse "`numlist'", parse(" ")
|
|
while "`1'" != "" {
|
|
if `gmin'==. { scalar `gmin' = `1' }
|
|
if `gmax'==. { scalar `gmax' = `1' }
|
|
scalar `gmin' = cond(`1'<`gmin',`1',`gmin')
|
|
scalar `gmax' = cond(`1'>`gmax',`1',`gmax')
|
|
mac shift
|
|
}
|
|
|
|
local command "`*' , `opts'"
|
|
local varlist "opt"
|
|
local options "Number(int 4)"
|
|
|
|
parse "`command'"
|
|
|
|
if `number' < 1 | `number' > 19 {
|
|
di in red "number must be in [1,19]"
|
|
error 198
|
|
}
|
|
local inter = `number' + 1
|
|
|
|
local ntick = `inter'
|
|
quietly {
|
|
tempname gran exp d f nf tmp1 tmp2
|
|
|
|
scalar `gran' = `gmax'-`gmin'
|
|
scalar `exp' = log10(`gran')
|
|
scalar `exp' = int(`exp') - (`exp'<0.0)
|
|
scalar `f' = `gran'/(10^`exp')
|
|
if `f' <= 1. { scalar `nf' = 1. }
|
|
else if `f' <= 2. { scalar `nf' = 2. }
|
|
else if `f' <= 5. { scalar `nf' = 5. }
|
|
else { scalar `nf' = 10. }
|
|
|
|
scalar `gran' = `nf'*10^`exp'
|
|
|
|
scalar `d' = `gran'/(`ntick'-1)
|
|
scalar `exp' = log10(`d')
|
|
scalar `exp' = int(`exp')-(`exp'<0.0)
|
|
scalar `f' = `d'/(10^`exp')
|
|
if `f' < 1.5 { scalar `nf' = 1. }
|
|
else if `f' < 3. { scalar `nf' = 2. }
|
|
else if `f' < 7. { scalar `nf' = 5. }
|
|
else { scalar `nf' = 10. }
|
|
|
|
scalar `d' = `nf'*10^`exp'
|
|
|
|
scalar `gmin' = `gmin'/`d'
|
|
scalar `gmin' = (int(`gmin') - (`gmin'<0.0))*`d'
|
|
scalar `tmp1' = `gmax'/`d'
|
|
scalar `tmp2' = int(`tmp1')
|
|
if `tmp2' < float(`tmp1') { scalar `tmp2' = `tmp2'+1 }
|
|
scalar `gmax' = `tmp2'*`d'
|
|
scalar `tmp1' = log10(`d')
|
|
local nfrac = int(-`tmp1')+(`tmp1'<0.0)
|
|
if `nfrac'<=0 { local nfrac = 0 }
|
|
|
|
if `nfrac' > 20 {
|
|
noi di in red "numbers too small for nice labels"
|
|
error 198
|
|
}
|
|
|
|
global `mac' ""
|
|
|
|
if `nfrac' == 0 {
|
|
scalar `tmp1' = `gmin'
|
|
}
|
|
else {
|
|
scalar `tmp1' = `gmin' + 1/(10^(`nfrac'+1))
|
|
}
|
|
scalar `tmp2' = `gmax' + `d'/2
|
|
local comma ""
|
|
while `tmp1' <= `tmp2' {
|
|
local stub = int(`tmp1')
|
|
if `nfrac' {
|
|
local gminb = int(`tmp1'*(10^`nfrac'))
|
|
local stubb = int(`stub'*(10^`nfrac'))
|
|
local frac = `gminb'-`stubb'
|
|
local frst = "00000000000000000000" + /*
|
|
*/ string(`frac')
|
|
local fstr = substr("`frst'",-`nfrac',.)
|
|
global `mac' = "${`mac'}`comma'`stub'.`fstr'"
|
|
}
|
|
else {
|
|
local tstr = string(`tmp1')
|
|
global `mac' = "${`mac'}`comma'`tstr'"
|
|
}
|
|
scalar `tmp1' = `tmp1' + `d'
|
|
local comma ","
|
|
}
|
|
|
|
end
|
|
|