📄 bargraph_g.class
字号:
/* bargraph_g
class for bar graphs
*/
*! version 1.0.31 16may2005
version 8
class {
class:
graphfamily = "bar"
instance:
graphstyle = .barstyle.new
array barstyles
horizontal = .yesno.new , style(no)
dotplot = .yesno.new , style(no)
boxplot = .yesno.new , style(no)
stack = .yesno.new , style(no)
percentages = .yesno.new , style(no)
rotate = .yesno.new , style(no)
fill = .yesno.new , style(yes)
include0 = .yesno.new , style(yes)
showvaraxis = .yesno.new , style(no)
/* overlay = .yesno.new , style(no) */
var_asc_sort = .yesno.new , style(yes)
grp_asc_sort = .yesno.new , style(yes)
sup_asc_sort = .yesno.new , style(yes)
swap_scaleaxis = .yesno.new , style(yes) /* here to allow set */
swap_groupaxis = .yesno.new , style(yes)
reverse_scale = .yesno.new , style(no)
barlabel_method = .barlabelstyle.new , style(none)
barlabel_pos = .barlabelpos.new , style(outside)
barlabel_opts = ""
custom_whiskers = .yesno.new , style(no)
median_type = .medtypestyle.new , style(line)
vargroup = 0 // category var #'s
group = 0
supergroup = 0
varsrt = 0 // sort variable #'s
grpsrt = 0
supsrt = 0
boxsrt = 0
shadevar = 2 /* usually vargroup */
barsize = 0
array labels /* array of labels */
array mlabels // marker label varnames
mlabvars = ""
array lvar // marker label var ids
yaxis1 = .axis.new // just for parsing
dot_signal = 0 // from dotgraph_g
box_signal = 0 // from boxgraph_g
horiz_signal = 0 // from hbargraph_g
_makelbls = 0 // internal signaling
_nsorts = 0
_ngrps = 0
_height_sorts = ""
} , inherit(graph_g)
/* -------------------------------------------------------------------------*/
/* Uses .new from graph.cls
Usage: .new statlist [if] [in] [wt] [, omit_opts graph_opts
bargraph_opts]
*/
program new
.Super.new
capture syntax [anything(id=varlist equalok)] [if] [in] [aw fw pw] ///
[ , READLOG(passthru) * ]
if `"`readlog'"' != `""' {
local 0 `"ForceACmd_1 `0'"' // sic , for expand
}
gettoken tok rest : 0 , match(paren)
if "`paren'" == "(" {
if `"`tok'"' == `"asis"' {
local asis 1
local 0 `"`rest'"'
}
}
local ignored_opts noDRAW NAME(string) ///
SCHeme(passthru) COPYSCHeme REFSCHeme ///
XSIZe(passthru) YSIZe(passthru) ///
FXSIZe(passthru) FYSIZe(passthru) SAVing(string asis)
syntax [anything(id=varlist equalok)] [if] [in] [aw fw pw] [ , ///
SHADEVAR(varname) ASCategory ///
ASYvars noLABel noFILL CW MISSing noOUTsides ///
CURORDER YVARoptions(string asis) ///
BOXPLOT PERcentages ///
ALLCategories ///
READLOG(passthru) ///
BYIF(string asis) ///
`ignored_opts' * ]
local wtexp `weight'`exp'
marksample touse
if (`"`byif'"' != `""') qui replace `touse' = 0 if ! (`byif')
local options `"`options' `boxplot' `percentages'"'
// over() options
_parse_over by varopt opt superopt options : ///
`=("`asyvars'"!="")' `=("`ascategory'"!="")' , `options'
local origopts `"`options'"'
if "`ascategory'" != "" & `"`yvaroptions'"' != `""' {
if `"`opt'"' != `""' {
di in green "(note: over() options superceeding yvaroptions())"
}
else local opt `"`yvaroptions'"'
}
else if `"`yvaroptions'"' != `""' {
if `"`varopt'"' != `""' {
di in green "(note: over() options superceeding yvaroptions())"
}
else local varopt `"`yvaroptions'"'
}
// Get the list of marker label variables
.GetMarkerLabVars , `origopts'
forval i = 1/`.mlabels.arrnels' {
local mlabvars `mlabvars' `.mlabels[`i']'
}
.mlabvars = "`mlabvars'"
if "`readlog'" == "" {
if `"`anything'"' == "" {
di as error "varlist or statlist required"
exit 198
}
local boxplot = ("`boxplot'" != "" | `.box_signal')
if ( "`fill'" != "" ) .fill.set_false
if "`curorder'" != "" & ! 0`asis' {
di as error "option curorder must be combined with (asis)"
exit 198
}
preserve
local vlist `._get_varlist `anything'' /* strip collapse syn */
local n_vars : word count `vlist'
._sub_tempnames by : _over `by' // no tempnames
._sub_vtempnames vlist anything : _var `"`vlist'"' `"`anything'"'
local byct : word count `by'
tokenize `by' /* set up groups */
if `: word count `vlist'' > 1 {
if `byct' > 2 {
di as error "may not specify more than two by " /*
*/ "variables when a varlist is specified"
exit 198
}
if "`ascategory'" == "" | `byct' == 2 {
local supergroup = cond(`byct'==2 , "`1'", "")
local group = cond(`byct'==2 , "`2'", "`1'")
local vargroup _variables
}
else {
local supergroup = cond(`byct'==1 , "`1'", "")
local group _variables
local vargroup _spacer
}
}
else {
if "`asyvars'" == "" | `byct' == 3 {
if `byct' == 3 {
local supergroup `1'
local group `2'
local vargroup `3'
}
else if `byct' == 2 {
local supergroup `1'
local group `2'
local vargroup _variables
}
else if `byct' == 1 {
local group `1'
local vargroup _variables
}
else local vargroup _variables
}
else {
else if `byct' == 2 {
local group `1'
local vargroup `2'
}
else if `byct' == 1 {
local vargroup `1'
}
else local vargroup _variables
}
}
.PushDo ._ngrps = `:word count `group' `supergroup' `vargroup''
if "`missing'" == "" { /* keep sample */
tempvar touse2
qui gen byte `touse2' = 1
markout `touse2' `by' , strok
qui keep if `touse2'
}
else .LabelMissing `by'
// relabel(), and sort() in over()
local k 0
foreach v in var "" super {
local ++k
if `"``v'opt'"' != `""' {
local 0 `", ``v'opt'"'
syntax [ , RELabel(string asis) SORT(string) TOTal * ]
if `"`relabel'"' != `""' {
local relab`v' `"._set_labels ``v'group' `relabel'"'
}
if "`sort'" != "" {
local srtlist "`srtlist' `.SetSort "`v'" `sort''"
}
if "`total'" != "" {
if "`totalopt'" != "" {
di as error "option total may be " ///
"specified in only one over() options"
exit 198
}
local totalopt total(`=`k'-("`ascategory'"!="")')
}
local overopts `"`overopts' `v'axopt(`options')"'
}
}
if `boxplot' | 0`asis' { // sort(varname)
foreach srtv of local srtlist {
gettoken unused : srtv , match(paren)
if (`"`paren'"' == `""') qui gen `srtv'
}
}
tempvar encvar strvar ltouse // labels
if "`allcategories'" == "" {
gen byte `ltouse' = `touse'
}
else if `"`if'"' != `""' & `"`byif'"' != `""' { // by and if
mark `ltouse' `if'
}
else {
gen byte `ltouse' = 1
}
local g 0
foreach grp of local by {
if "`=substr("`:type `grp''", 1, 3)'" != "str" {
qui egen `strvar' = group(`grp') if `ltouse' , ///
label missing lname(_blbl_`++g')
drop `grp'
rename `strvar' `grp'
}
// strings encoded
if "`=substr("`:type `grp''", 1, 3)'" == "str" {
tempname tmplbl
qui encode `grp' if `ltouse', gen(`encvar') ///
label(`tmplbl')
drop `grp'
rename `encvar' `grp'
if "`curorder'" != "" {
._relabel_var `grp'
}
}
}
// compute values
if ("`allcategories'" != "") {
tempfile preserve data
qui keep if `ltouse'
qui save `"`preserve'"'
}
if `boxplot' {
BoxData `anything' if `touse' [`wtexp'] , ///
by(`by') `cw' vargroup(`vargroup') `label' ///
sortvars(`._get_varlist `srtlist'') `totalopt'
local vlist _values
local srtlist `srtlist' _box_sort
if "`outsides'" != "" {
qui drop if _box_sort == 9999
local mytitleopts note("excludes outside values", suffix)
}
}
else if ! 0`asis' {
collapse `anything' `srtlist' if `touse' [`wtexp'] , ///
by(`by') `cw' clabel graphbar(vlist)
}
else {
qui keep if `touse'
}
foreach svar in `._get_varlist `srtlist'' {
local vlist : subinstr local vlist "`svar'" "" , word
}
if ("`allcategories'" != "") {
if (`boxplot') sort `by' _box_sort
else if (`"`by'"' != `""') sort `by'
qui save `"`data'"'
qui use `"`preserve'"'
tempvar one
gen byte `one' = 1
collapse `one' , by(`by') clabel
if (`boxplot') {
qui expand = 5
if `"`by'"' != `""' {
qui bysort `by': gen _box_sort = _n
}
else qui gen _box_sort = _n
sort `by' _box_sort
qui merge `by' _box_sort using `"`data'"'
capture sort _variables
if !_rc ///
qui replace _variables=_variables[_n-1] if _variables==.
}
else qui merge `by' using `"`data'"'
drop _merge `one'
}
local srtvars `._get_varlist `srtlist''
// turn varlist into vargroup
// (or group)
if ("`vargroup'" == "_variables" | "`vargroup'" == "_spacer") & ///
! `boxplot' {
if "`vargroup'" == "_variables" {
tsrevar `vlist' `group' `supergroup' `srtvars' , list
}
else tsrevar `vlist' `supergroup' `srtvars' , list
keep `r(varlist)'
qui gen long _variables = .
qui gen double _values = .
local N `=_N'
local k 0
foreach var of local vlist {
local ++k
local lab : variable label `var'
if `"`lab'"' == `""' | "`label'" != "" {
local lab `var'
}
label define _T_barlbl `k' `"`lab'"' , add
if `N' > 0 {
if `k' > 1 {
qui expand 2 in 1/`N' /* space over speed */
}
qui replace _variables = `k' in -`N'/l
qui replace _values = `var' in -`N'/l
}
}
label values _variables _T_barlbl
if `:word count `vlist'' == 1 {
if `"`:variable label `vlist'':"' != "" {
label variable _values /*
*/ `"`:variable label `vlist''"'
local scaletitle `"`:variable label `vlist''"'
}
else {
label variable _values `vlist'
local scaletitle `"`vlist'"'
}
}
local vlist _values
if "`vargroup'" != "_variables" {
label define _T_nolab 1 " "
gen _spacer = 1
label values _spacer _T_nolab
}
}
if 0`asis' {
isid `supergroup' `group' `vargroup' , missok
}
// fill in missing combos
if `boxplot' {
if c(N) > 0 {
qui fillin `supergroup' `group' `vargroup' _box_sort
}
else di as error "No observations to graph"
}
else if `._ngrps' > 1 {
qui fillin `supergroup' `group' `vargroup'
}
`relabvar' // relabeling delayed to here
`relab'
`relabsuper'
// Set category variables
if ("`vargroup'" != "") .PushDo .vargroup = 2
if ("`group'" != "") .PushDo .group = 3
if ("`supergroup'" != "") .PushDo .supergroup = 4
foreach srt of local srtvars { // variable sorts
local g = substr("`srt'" , 2, 3)
if "`g'" == "var" {
rename `srt' _var_sort
}
else if "`g'" == "grp" {
qui egen _grp_sort = mean(`srt') , by(`supergroup' `group')
}
else if "`g'" == "sup" {
qui egen _sup_sort = mean(`srt') , by(`supergroup')
}
}
local srtvars : subinstr local srtvars "0" "" , all
tempname catheight egroup grptotal
foreach srt in `._height_sorts' { // height sorts
gettoken g cat : srt
local pct_sort = 0
if ("`g'" == "grp") {
local mby `supergroup' `group'
if ("`percentages'" != "") local pct_sort 1
}
else if ("`g'" == "sup") {
local mby `supergroup'
}
else {
local mby `supergroup' `group' `vargroup'
}
// map to seq from 1
if "`g'" == "grp" | "`g'" == "sup" {
egen long `egroup' = group(`vargroup')
qui gen double `catheight' = `vlist' * (`egroup' == `cat')
}
else qui gen double `catheight' = `vlist'
capture assert `catheight' == 0
if ! _rc {
local cat `cat'
di as error "sort() invalid, category `cat' not found"
exit 198
}
if `pct_sort' {
qui egen double `grptotal' = sum(`vlist') , by(`mby')
qui replace `catheight' = `catheight' / `grptotal'
drop `grptotal'
}
if (`boxplot') qui replace `catheight' = . if _box_sort != 1
qui egen _`g'_sort = sum(`catheight') , by(`mby')
.PushDo ._nsorts = `._nsorts' + 1
.PushDo .`g'srt = 1 + `._ngrps' + `._nsorts'
local srtvars "`srtvars' _`g'_sort"
capture drop `catheight'
capture drop `egroup'
}
} /* end readlog */
if "`.mlabvars'" != "" {
local mlabvars `.mlabvars'
local nvars : word count ///
`vargroup' `group' `supergroup' `srtvars'
forval i = 0/`.mlabels.arrnels' {
if "`.mlabels[`i']'" != "" {
local j : list posof "`.mlabels[`i']'" ///
in mlabvars
.PushDo .lvar[`i'] = `nvars' + `j' + 1
}
}
}
/* let graph_g.new handle readlog etc.
* it is given all the variables that need to
* be in the serset, most also retained as
* options so .makegraph can find them.
*/
.parse_sersets `vlist' `vargroup' `group' `supergroup' `srtvars' ///
`.mlabvars', ///
labels `readlog' `mytitleopts' `overopts' ///
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -