⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bargraph_g.class

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 CLASS
📖 第 1 页 / 共 5 页
字号:
/*				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 + -