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

📄 bargraph_g.class

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 CLASS
📖 第 1 页 / 共 5 页
字号:
	}
	if `"`linegap'"' != `""' {
		local linegap : subinstr local linegap "neg" "-"
		local linegap : subinstr local linegap "pct" ""
		capture confirm number `linegap'
		if _rc | `:word count `linegap'' != 1 {
			di as error "linegap() invalid"
			exit 198
		}
		local edits `"`edits' gap(`=`linegap'-100')"'
	}
	if `"`boxgap'"' != `""' {
		local edits `"`edits' gap(`boxgap')"'
	}
	if `"`bargap'"' != `""' {
		local edits `"`edits' gap(`bargap')"'
	}
	if `"`outergap'"' != `""' {
		local edits `"`edits' outer_gap(`outergap')"'
	}
	if `"`intensity'"' != `""' {
		local edits `"`edits' intensity(`intensity')"'
	}
	if `"`lintensity'"' != `""' {
		local edits `"`edits' lintensity(`lintensity')"'
	}
	if "`yalternate'" != "" {
		.swap_scaleaxis.set_swap
	}
	if "`xalternate'" != "" {
		.swap_groupaxis.set_swap
	}
								// dotchars
	if ("`linetype'" != "") {
		local edits `"`edits' dottype(`linetype')"'
	}
	if (`lowextension' != -999) {
		local edits `"`edits' dot_extend_low(`lowextension')"'
	}
	if (`highextension' != -999) {
		local edits `"`edits' dot_extend_high(`highextension')"'
	}

	if `ndots' != -99 {
		local edits `"`edits' num_dots(`ndots')"'
	}
	if "`rwidth'" != "" {
		local edits `"`edits' dot_areawidth(`rwidth')"'
	}
	if `"`noextendlines'"' != `""' {
		local edits `"`edits' extend_dots(no)"'
	}
	if `"`extendlines'"' != `""' {
		local edits `"`edits' extend_dots(yes)"'
	}
							// boxplot settings
	if `"`alsize'"' != `""' {
		local edits `"`edits' fence_size(`alsize')"'
	}
	if `"`capsize'"' != `""' {
		local edits `"`edits' fence_capsz(`capsize')"'
	}
	if ("`medtype'"     != "")  .median_type.setstyle , style(`medtype')
	if ("`nocwhiskers'" != "")  .custom_whiskers.setstyle , style(no)
	if ("`cwhiskers'"   != "")  .custom_whiskers.setstyle , style(yes)
	if `"`medmarker'"' != `""' {
		._parse_marker_edit , `medmarker'
		local edits `"`edits' median_markstyle(`r(edit)')"'
	}
	if `"`medline'"' != `""' {
		._parse_line_edit , `medline'
		local edits `"`edits' median_linestyle(`r(edit)')"'
	}

	if ( `"`edits'"' != `""' )  .graphstyle.editstyle `edits' editcopy

 	if      (`.dotplot.istrue')  local scaleax "dot_scale_"
	else if (`.boxplot.istrue')  local scaleax "box_scale_"
	else                         local scaleax "bar_scale_"

	if "`horizontal'" != "" {		/* horiz/vertical settings */
		local h h
		local scaleax "scheme `scaleax'horiz"
	}
	else {
		local scale vertical
		local scaleax "scheme `scaleax'vert"
	}

	if ( "`fill'" != "" )  .fill.set_false

	.sersets[1].set

						/* plotregion and scales */
	local prstyle = "scheme " +					///
			cond(`.boxplot.istrue', "graph" , "`h'bargraph")
	.insert (plotregion1 = .Global.plotregion.new , style(`prstyle')) new
	.plotregion1.xscale.set, min(0) max(100)
	.plotregion1.yscale.addseries `.sersets[1].id' 1 		/*
		*/ `.sersets[1].sers[1].objkey'
	if `.include0.istrue' {
		.plotregion1.yscale.addmin 0
		.plotregion1.yscale.addmax 0
	}

						// axes 
	local scaletitle `"`.sersets[1].sers[1].label'"'
	if 0`.percentages.istrue' {
		if `"`scaletitle'"' != `""' {
			local topt `"title(`"percent of `scaletitle'"')"'
		}
		else	local topt title(percent)
	}
	else	local topt `"title(`"`scaletitle'"')"'
	local pos = cond(`.swap_scaleaxis.istrue', "rightof", "leftof")
	.insert (scaleaxis = .axis.new, plotregion(`.plotregion1.objkey')   /*
		*/ style(`scaleax') position(left) `topt')		    /*
		*/ `pos' plotregion1 , ring(.5)
	if `.swap_scaleaxis.istrue' {
		.scaleaxis.position.setstyle, style(right)
	}
	if `.stack.istrue' | `.percentages.istrue' {
		._reset_scaling
	}

	local bardot = cond(0`.dotplot.istrue' , "dot" , "bar")
	if 0`.supergroup' {
	    .insert (supaxis = .axis.new,				/*
	    	*/ plotregion(`.plotregion1.objkey')			/*
		*/ style(scheme `bardot'_super) position(below))	/*
		*/ below plotregion1 , ring(.8)
	    .supaxis.set_userules no
	    .supaxis.title.draw_view.set_no
	}
	if 0`.group' {
	    .insert (grpaxis = .axis.new,				/*
	    	*/ plotregion(`.plotregion1.objkey')			/*
		*/ style(scheme `bardot'_group) position(below))	/*
		*/ below plotregion1 , ring(.7)
	    .grpaxis.set_userules no
	    .grpaxis.title.draw_view.set_no
	}
	.insert (varaxis = .axis.new, plotregion(`.plotregion1.objkey')  /*
		*/ style(scheme `bardot'_var) position(below))		 /*
		*/ below plotregion1 , ring(.6)
	.varaxis.set_userules no

	if "`showyvars'" != "" {
		.graphstyle.label_vargroups.set_true
		.showvaraxis.set_true
		if "`.grpaxis.isa'" != "" {
			.grpaxis.style.editstyle linestyle(none) editcopy
		}
	}

	if `.swap_groupaxis.istrue' {
		.swap_groupaxis.set_false
		._set_swap_groupaxis yes
	}
	if `.graphstyle.label_vargroups.isfalse' & (`.group' | `.supergroup') {
		.varaxis.draw_view.set_false
	}

						/* create barstyles */
	forvalues i=1/0`.sersets[1].sers[`.shadevar'].categories' {
		local i_pstyle = mod(`i'-1, 0`pcycle')+1
		.barstyles[`i'] = .seriesstyle.new ,			///
				  style(scheme p`i_pstyle'`._pstyle_suffix')
		.SetIntensity `i'
	}

	if `"`varaxopt'"' != `""' {			// group axis options
		.ParseLogGaxis `log' varaxis , `varaxopt'
	}
	if `"`axopt'"' != `""' {
		.ParseLogGaxis `log' grpaxis , `axopt'
	}
	if `"`superaxopt'"' != `""' {
		.ParseLogGaxis `log' supaxis , `superaxopt'
	}
	_fr_runlog `log' , nologging

	._relabel_xaxes ,  nolegend			/* label x axes */


					/* add the view to be drawn it just 
					 * redirects drawing drawbars below */
	.plotregion1.insert bargraph = .barview.new `.objkey'

	if `.dotplot.istrue' {					// dot keys
		.plotregion1.bargraph.type.setstyle , style(scatter)
	}

							// Options

	.ParseBars   ,   `origopts'			// Edits to barstyles
	.ParseBoxes  ,   `r(rest)'			// Edits to barstyles
	.ParseMarkers ,  `r(rest)'			// Edits to markers
	.ParseDots ,     `r(rest)'			// Dots
	.ParseLines ,    `r(rest)'			// Lines
	.ParseRectangles,`r(rest)'			// Rectangles
	local options `"`r(rest)'"'

	.`log' = {}

	.yaxis1.ref = .scaleaxis.ref	
	.ParseAndLogAxes         `log' 0 "" "" "1" `r(rest)'	// yaxis
	.parse_and_log_titles    `log' "" `r(rest)'		// titles
	_fr_legend_parse_and_log `log'    `r(rest)'		// legend
	.parse_and_log_spacers   `log' "" `r(rest)'		// spacers
	local options `"`r(rest)'"'

	_fr_runlog `log' , nologging			// need legend axes
	.`log' = {}					// for horizontal

	if "`horizontal'" != "" {			// handle horizontal
		._set_horizontal yes norelabel
	}
	if `.reverse_scale.istrue' {
		.reverse_scale.setstyle , style(no)
		_set_reverse_scale yes
	}
	if `.sersets[1].sers[1].min' < 0 {		// margin when y < 0
		if "`horizontal'" == "" {
			.plotregion1.style.editstyle			///
			    margin(b=`.plotregion1.style.margin.top') editcopy
		}
		else {
			.plotregion1.style.editstyle			///
			    margin(l=`.plotregion1.style.margin.right') editcopy
		}
	}

	_fr_area_parse_and_log   `log' "" GRAPHRegion ,			    ///
					`options'		// graphreg
	_fr_area_parse_and_log   `log' plotregion1 PLOTRegion ,		    ///
					`r(rest)'		// plotregion
	_fr_merged_implicit `log' BGColor				    ///
		".bgcolor.setstyle , style(X)" , `r(rest)'	// bgcolor

	.ParseBlabel , `r(rest)'

	.ParseAndLogText `log' plotregion1 , `r(rest)'

	local 0 , `r(rest)'
	syntax [ , SCALE(string) ]
	if `"`scale'"' != `""' {
		.`log'.Arrpush .set_scale `scale'		// scale
	}

	_fr_runlog `log' , nologging


	.sersets[1].set				/* set the current serset */
	._sort					/* sort serset */
end

program _pstyle_suffix
	if (`.boxplot.istrue')  class exit "box"
	if (`.dotplot.istrue')  class exit "dot"
	class exit "bar"
end


/* -------------------------------------------------------------------------*/
/* Draw a single bar on the graph.  This program will often be shadowed by 
   a class that inherits from bargraph.
*/

program draw_bar
	args x y size draw_rect has_pat styledex     // may really be y x size

	if `.horizontal.istrue' {
		if `.dotplot.istrue' {
			gdi point `=`y'+`size'' `=`x'+`.barsize'/2'
		}
		else {
			if 0`has_pat' {
			   ._draw_pat_rect `y' `x' `=`y'+`size''	///
			   		   `=`x'+`.barsize'' `styledex'
			}
			else {
			   gdi rectangle `y' `x' `=`y'+`size'' `=`x'+`.barsize''
			}
		}
	}
	else {
		if `.dotplot.istrue' {
			gdi point `=`x'+`.barsize'/2' `=`y'+`size''
		}
		else {
			if 0`has_pat' {
			   ._draw_pat_rect `x' `y' `=`x'+`.barsize''	///
			   		   `=`y'+`size'' `styledex'
			}
			else {
			   gdi rectangle `x' `y' `=`x'+`.barsize'' `=`y'+`size''
			}
		}
	}
end


program _draw_pat_rect
	args x0 y0 x1 y1 styledex

	._set_line_as_areastyle `styledex'
	gdi rectangle `x0' `y0' `x1' `y1'
	._set_linestyle `styledex'
	_gr_drawrect `x0' `y0' `x1' `y1'
end


// ---------------------------------------------------------------------------
// Draw a single boxplot on the graph.  This program may be shadowed by 
// a class that inherits from bargraph.

program draw_box
	args z i_v j has_pat i_g styledex


	scalar `j'  = `j' + 1
	local p50   = serset(1, `j')
	scalar `j'  = `j' + 1
	local p25   = serset(1, `j')
	scalar `j'  = `j' + 1
	local p75   = serset(1, `j')
	scalar `j'  = `j' + 1
	local adjl  = serset(1, `j')
	scalar `j'  = `j' + 1
	local adjh  = serset(1, `j')

	local zmid   = `z' + `.barsize' / 2
	local fence2 = `.barsize' * `.graphstyle.fence_size.prop' / 2
	local fencel = `zmid' - `.barsize' * `.graphstyle.fence_size.prop' / 2
	local fenceh = `zmid' + `.barsize' * `.graphstyle.fence_size.prop' / 2

	local i_cat `._style_cat `=`j'''

	if `.horizontal.istrue' {
		if "`.graphstyle.stylename'" != "tukey" {
			if 0`has_pat' {
				._draw_pat_rect `p25' `z' `p75'		///
						`=`z'+`.barsize'' `styledex'
			}
			else	gdi rectangle `p25' `z' `p75' `=`z'+`.barsize''
		}

		if "`.median_type.stylename'" == "marker" {
			.graphstyle.median_markstyle.setgdifull
			gdi point `p50' `zmid'
		}
		else if "`.median_type.stylename'" == "cline" {
			.graphstyle.median_linestyle.setgdifull
			gdi line `p50' `z' `p50' `=`z'+`.barsize''
		}
		else	gdi line `p50' `z' `p50' `=`z'+`.barsize''

		if (`.custom_whiskers.istrue')				///
			.graphstyle.dot_linestyle.setgdifull
		else if ("`.median_type.stylename'" != "line")		///
			.barstyles[`i_cat'].area.setgdifull

		gdi line `p25' `zmid' `adjl' `zmid'
		gdi line `p75' `zmid' `adjh' `zmid'
		gdi line `adjl' `fencel' `adjl' `fenceh'
		gdi line `adjh' `fencel' `adjh' `fenceh'

		local cap = `.barsize' * `.graphstyle.fence_capsz.prop'	///
			    * `gdi(ybeta)' / `gdi(gbeta)'
		if `cap' {
			if `adjl' < `p25'  & `adjl' < . {
				gdi moveto	`adjl' `fencel' 
				gdi gm_rlineto	`cap' 0
				gdi moveto	`adjl' `fenceh'
				gdi gm_rlineto	`cap' 0
			}
			if `adjh' > `p75'  & `adjh' < . {
				gdi moveto	`adjh' `fencel' 
				gdi gm_rlineto	 -`cap' 0
				gdi moveto	`adjh' `fenceh' 
				gdi gm_rlineto	-`cap' 0
			}
		}

	}
	else {
		if "`.graphstyle.stylename'" != "tukey" {
			if 0`has_pat' {
				_gr_drawrect `z' `p25' `=`z'+`.barsize'' `p75'
				._draw_pat_rect `z' `p25' `=`z'+`.barsize'' ///
						`p75' `styledex'
			}
			else	gdi rectangle `z' `p25' `=`z'+`.barsize'' `p75'
		}

		if "`.median_type.stylename'" == "marker" {
			.graphstyle.median_markstyle.setgdifull
			gdi point `zmid' `p50'
		}
		else if "`.median_type.stylename'" == "cline" {
			.graphstyle.median_linestyle.setgdifull
			gdi line `z' `p50' `=`z'+`.barsize'' `p50'
		}
		else	gdi line `z' `p50' `=`z'+`.barsize'' `p50'

		if (`.custom_whiskers.istrue')				///
			.graphstyle.dot_linestyle.setgdifull
		else if ("`.median_type.stylename'" != "line")		///
			.barstyles[`i_cat'].area.setgdifull

		gdi line `zmid' `p25' `zmid' `adjl'
		gdi line `zmid' `p75' `zmid' `adjh'
		gdi line `fencel' `adjl' `fenceh' `adjl'
		gdi line `fencel' `adjh' `fenceh' `adjh'

		local cap = `.barsize' * `.graphstyle.fence_capsz.prop'	///
			    * `gdi(xbeta)' / `gdi(gbeta)'
		if `cap' {
			if `adjl' < `p25'  & `adjl' < . {
				gdi moveto	`fencel' `=`adjl''
				gdi gm_rlineto	0 `cap'
				gdi moveto	`fenceh' `=`adjl''
				gdi gm_rlineto	0 `cap'
			}
			if `adjh' > `p75'  & `adjh' < . {
				gdi moveto	`fencel' `=`adjh''
				gdi gm_rlineto	0 -`cap'
				gdi moveto	`fenceh' `=`adjh''
				gdi gm_rlineto	0 -`cap'
			}
		}

	}

	.draw_outside_points `i_cat' `j' `zmid'

	if `._makelbls' {				    // label
		if (`p25' >= .)  local p25 `p50'
		if (`p75' >= .)  local p75 `p50'
		.MakeLabel 1 `z' `p25' `=`p75'-`p25''			///
			   `=serset(`.vargroup',`j')'			///
			   `=serset(`.group',`j')' 1
	}

end

program draw_outside_points
	args i_cat j zmid

	// shortcut for barstyles of the current category
	local style barstyles[`i_cat']

	if "`.lvar[`i_cat']'" != "" {
		// points are labeled
		draw_labeled_points `style' `j' `zmid' `.lvar[`i_cat']'
	}
	else {
		// points not labeled
		draw_points `style' `j' `zmid'
	}

end

program draw_points
	args style j zmid

	if `.horiz_signal' {
		local y `zmid'
		local x serset(1, `j')
	}
	else {
		local x `zmid'
		local y serset(1, `j')
	}

	.`style'.marker.setgdifull
	while serset(`.boxsrt', `=`j'+1') == 9999 {
		scalar `j'  = `j' + 1
		gdi point `=`x'' `=`y''
	}
end

program draw_labeled_points
	args style j zmid lvar

	.`style'.marker.setgdifull
	.`style'.label.setgdifull

	if `.horiz_signal' {
		local y `zmid'
		local x serset(1, `j')
	}
	else {
		local x `zmid'
		local y serset(1, `j')
	}

	local drawn `.`style'.marker.drawn'

	local dostr 0

	if 0`.sersets[1].sers[`lvar'].vlabs.dynamicmv.arrnels' {
		local labarr sersets[1].sers[`lvar']
		local dolbl 1
	}
	else {
		local dolbl 0
		local fmt `.sersets[1].sers[`lvar'].format'

		if "`.sersets[1].sers[`lvar'].type.setting'" == "string" {
			local dostr 1
		}
					// consider allow a fmt from style

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -