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

📄 yxview.class

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 CLASS
📖 第 1 页 / 共 2 页
字号:
/*                                 yxview

	Base class for data views that have an x variable, a single y variable 
	and possibly a weight variable
*/
*! version 1.0.5  11feb2005

version 8

class {
	type	= .yxtype.new,	     style(scatter)
	style	= .seriesstyle.new

	draw_view       = .yesno.new, style(yes)
	fill_if_undrawn = .yesno.new, style(no)

//	add_plotregion	= .yesno.new, style(no)
	conf_interval	= .yesno.new, style(no)
	ci_of_expected	= .yesno.new, style(yes)
	addview		= .xyaddviews.new, style(none)

	// class serset serset			-- declared dynamically
	double xvar				// x variable id
	double yvar				// y variable id
	double lvar				// label variable id
	double wvar				// weight variable id
	double pvar				// position var, rarely used

	numkeys		= 1			// number of keys for the view

	plotregion	= ""			// string key of plotregion
						// may be empty

	delegate_draw	= ""			// a delegate drawing program


				// type specfic info //

	grouped		= .yesno.new, style(yes)

						// scatter and connected views
	double jitterseed
	jitter		= 0			// jitter amount, gmetric

						// bar, spike, dropline, dot
	base		= (.)
	bar_drop_to	= .ordstyle.new    , style(x)

						// bar views
	bar_size	= 1
	bar_gap		= 0
	bartype		= .yxbartype_g.new , style(fixed)

						// dotplot views
	dots_extend	= .yesno.new , style(yes)
	num_dots	= 75

						// area view
	drop_base	= .yesno.new , style(yes)

} , inherit(subview)


/* -------------------------------------------------------------------------*/
program new

	.addview.setstyle , style(none)
	.jitterseed = `gdi(newjitterseed)'
	if `"`0'"' != `""' {
		.set `0'
	}
end


program set

	syntax [, Serset(string) Xvariable(string) Yvariable(string)	///
		  Lvariable(string) Wvariable(string) Pvariable(string)	///
		  STyle(string) Type(string) PLOTRegion(string) ]

	if "`serset'" != "" { 
		if "`.Local.serset.isa'" == "" {
			.Declare serset = .`serset'.ref
		}
		else {
			.serset.ref = .`serset'.ref 
		}
	}
	if "`plotregion'" != "" { 
		.plotregion = `"`.`plotregion'.objkey'"'
	}

						// set the x, y and maybe l 
						// and w variable ids 
	foreach v in xvariable yvariable lvariable wvariable pvariable {
		if "``v''" != "" {
			local att = substr("`v'", 1, 4)
			capture confirm integer number ``v''
			if _rc {
				local varid = `.serset.seriesof ``v'''
				if 0`varid' {
					.`att' = `varid'
				}
				else {
				    di in white `"``v'' not found in serset"'
				}
			}
			else	.`att' = ``v''
		}
	}

	if `"`style'"' != `""' {
		.style.setstyle , style(`style')
	}

	if "`type'" != "" { 
		.type.setstyle, style(`type')
	}
end

/* -------------------------------------------------------------------------*/
/*
	Returns the value of x, y for the specified observation

	Usage:  .X #_obs
*/

program X
	.serset.set

	class exit = serset(`.xvar', `1')
end

program Y
	.serset.set

	class exit = serset(`.yvar', `1')
end


/* -------------------------------------------------------------------------*/
/*
	Returns minimum and maximum sizes
*/

program ranges , rclass

	capture return scalar xmin = `.serset.sers[`.xvar'].min'
	capture return scalar xmax = `.serset.sers[`.xvar'].max'
	capture return scalar ymin = `.serset.sers[`.yvar'].min'
	capture return scalar ymax = `.serset.sers[`.yvar'].max'

	if "`.bar_drop_to.stylename'" == "y" {
		capture local xmin = return(ymin)
		capture local xmax = return(ymax)

		capture return scalar ymin = return(xmin)
		capture return scalar ymax = return(xmax)
		capture return scalar xmin = `xmin'
		capture return scalar xmax = `xmax'
	}

/*
	if `.base' < . {
		local ord = cond("`.bar_drop_to.snm"=="y", "x", "y")

		capture return scalar `ord'min = min(return(`ord'min) , `.base')
		capture return scalar `ord'max = max(return(`ord'max) , `.base')
	}
*/
end


/* -------------------------------------------------------------------------*/
/*
	Returns the label of the specified dimension variable, or if that is 
	blank the name of the <dim>variable.  Optionally, returns only the name.

	Note will work for dim = "y2" or "y3" for y2xview_g.class and
	y3xview_g.class.
*/

program dimtitle

	gettoken dim 0 : 0

	syntax [ , Nameonly Keynum(integer 1) ]		// keynum ignored

	if "`.bar_drop_to.stylename'" == "y" {
		local dim = cond("`dim'" == "x" , "y", "x")
	}

	if ! `.Local.serset.isofclass serset' {
		exit
	}

	if "`nameonly'" == "" {
		class exit `"`.serset.sers[`.`dim'var'].label_or_name'"'
	}

	class exit `"`.serset.sers[`.`dim'var'].name'"'
end


/* -------------------------------------------------------------------------*/
/*
	Returns the format of the specified dimension variable.
*/

program dimformat

	gettoken dim 0 : 0
	syntax

	if ! `.Local.serset.isofclass serset' {
		exit
	}

	if "`.bar_drop_to.stylename'" == "y" {
		local dim = cond("`dim'" == "x" , "y", "x")
	}

	class exit `"`.serset.sers[`.`dim'var'].format'"'
end

/* -------------------------------------------------------------------------*/
/*
	Returns the key of series to be used for value labels in the specified
	dimension.
*/

program dim_value_label_series
	gettoken dim 0 : 0
	syntax

	if "`.bar_drop_to.stylename'" == "y" {
		local dim = cond("`dim'" == "x", "y", "x")
	}
	class exit "`.serset.sers[`.`dim'var'].objkey'"
end


/* -------------------------------------------------------------------------*/
/*
	Returns a key object of the view
*/
program newkey

	if `.numkeys' == 0 {
		class exit ""
	}

	syntax [anything] [ , Position(passthru) ]
							// anything ignored

	class exit .yxkey_g.new , view(`.objkey') `position'
end


/* -------------------------------------------------------------------------*/
/*
	Returns a label for the view.  In this case based on the y variable.
	Note, supports the -NAMEonly- option to ignore variable labels and 
	return only the variable name of the y series.
*/
program label
	local dim = cond("`.bar_drop_to.stylename'" == "x" , "y" , "x")
	class exit `"`.dimtitle `dim' `0''"'
end


/* -------------------------------------------------------------------------*/
/*
	Assumes an appropriate scale has already been set.
*/
program draw

	if ! `.draw_view.istrue' { 
		exit						/* EXIT */
	}

	if "`.delegate_draw'" != "" {
		yxview_`.delegate_draw'_draw
		exit
	}

	.serset.set

	yxview_`.type.stylename'_draw			// may be an ado file
end

program yxview_scatter_draw
	._draw_points
end

program yxview_line_draw
	.style.line.setgdifull
	._draw_line
end

program yxview_connected_draw
	.style.line.setgdifull
	._draw_line
	._draw_points
end

program _draw_points
	args nolabs

	if 0`.lvar' & "`nolabs'" == "" {			// labelled
		if "`.style.marker.symbol.setting'"  == "none" &	///
		   "`.style.label.position.setting'" == "0"    &	///
		    `.pvar' >= . {
			.style.label.setgdifull				// text
			if 0`.serset.sers[`.lvar'].vlabs.dynamicmv.arrnels' {
				gdi scatterlabel `.serset.id'		///
					`.xvar' `.yvar' `.lvar'		///
					`.serset.sers[`.lvar'].vlabs.objkey'
			}
			else {
				if "`.serset.sers[`.lvar'].type.setting'" ///
					== "numeric" {
					local fmt `.serset.sers[`.lvar'].format'
				}
				gdi scattervalue `.serset.id' `.xvar'	///
					`.yvar' `.lvar' `fmt'
			}

			gdi update
		}
		else {
			._draw_labeled_points
		}

		exit							// Exit
	}

	if `.grouped.isfalse' {					// obs styled
		_draw_styled_points
		exit							// Exit
	}

	if 0`.wvar' {						// weighted
		._draw_weighted_points
		exit
	}

								// "normal"
	if "`.style.marker.backsymbol.setting'" != "none" {
		.style.marker.setgdifull,  backing
		gdi jitterseed = `.jitterseed'
		gdi gm_jitter  = `.jitter'
		gdi scatter `.serset.id' `.xvar' `.yvar'
		gdi gm_jitter  = 0
	}

	if 0`.style.marker.drawn' {
		.style.marker.setgdifull
		gdi jitterseed = `.jitterseed'
		gdi gm_jitter  = `.jitter'
		gdi scatter `.serset.id' `.xvar' `.yvar'
		gdi gm_jitter  = 0
	}

end

program _draw_line

	if "`.style.connect.stylename'" == "none" {
		exit
	}
	gdi scatterline_connect_type    = `.style.connect.stylename'
	gdi scatterline_connect_missing = `.style.connect_missings.stylename'
	gdi scatterline `.serset.id' `.xvar' `.yvar'
	gdi update
end

program _draw_labeled_points
	args labonly

	.style.marker.setgdifull				// symbols 
	.style.label.setgdifull					// text

	if ("`labonly'" != "")  local drawn 0
	else                    local drawn `.style.marker.drawn'

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

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

	local gpos = 0`.style.label.position.setting'
	if `gpos' == 0 {
		local shift 0
	}
	else {
		local shift  = `.style.marker.size.gmval' / 2 + 	///
			       `.style.label.textgap.gmval'
	}
	local angle    `.style.label.position.angle'
	local xshift = `shift' * cos(`angle')
	local yshift = `shift' * sin(`angle')

	forvalues j = 1/`:serset N' {

		local x = serset(`.xvar', `j')
		local y = serset(`.yvar', `j')

		if `x' >= . | `y' >= . {
			continue				// Continue
		}

		if `.pvar' < .  {			// custom position
			local pos = serset(`.pvar', `j')
			local lab					///
		    `"`._get_label `dolbl' `dostr' "`fmt'" `j' `labarr''"'
			if `"`lab'"' != `""' {
				if `pos' >= . {
					local pos `gpos'
				}
				_draw_point `x' `y' `pos' `drawn' `lab'
				continue			// Continue
			}
		}

		if ! `.grouped.istrue' {
			.obs_styles[`j'].marker.setgdifull    // symbols 
			.obs_styles[`j'].label.setgdifull     // text
			local shift  = `.obs_styles[`j'].marker.size.gmval'  ///
					/ 2 + `.style.label.textgap.gmval'
			local angle    `.obs_styles[`j'].label.position.angle'
			local xshift = `shift' * cos(`angle')
			local yshift = `shift' * sin(`angle')
		}

		if `drawn' {				// draw point
			gdi point  `x' `y'
		}
		else {
			gdi moveto `x' `y'
		}

		gdi gm_rmoveto `xshift' `yshift'	// offset for labels

		if `dolbl' {
			gdi ctext `.`labarr'.value_label `=serset(`.lvar',`j')''
		}
		else {
		   if `dostr' {
			local lab : di `fmt' `"`=strserset(`.lvar',`j')'"'
			local lab `lab'					// sic
			gdi ctext `lab'
		   }
		   else {
			gdi ctext `=string(`=serset(`.lvar',`j')',"`fmt'")'
		   }
		}
	}

end

program _get_label
	args dolbl dostr fmt j labarr

	if `dolbl' {
		class exit `"`.`labarr'.value_label `=serset(`.lvar',`j')''"'
	}
	else {
		if `dostr' {
			local lab : di `fmt' `"`=strserset(`.lvar',`j')'"'
			local lab `lab'					// sic
			class exit `"`lab'"'
		}
		else {
			class exit `"`=string(`=serset(`.lvar',`j')',"`fmt'")'"'
		}
	}
end

				// _draw_labeled_points could use always
				// _draw_point but it is more efficient as is

program _draw_point
	gettoken x     0     : 0
	gettoken y     0     : 0
	gettoken pos   0     : 0
	gettoken drawn label : 0

	if `x' >= . | `y' >= . {
		exit
	}

	if ("`drawn'" == "")  local drawn 1

	capture noisily {
		if `pos' < . {
			local holdpos = `.style.label.position.setting'
			.style.label.position.setstyle , style(`pos')
		}
		else {
			local pclock "style.label.position"
			local pos    `.style.label.position.setting'
		}

		.style.marker.setgdifull			// symbols 
		.style.label.setgdifull				// text
		local angle  `.style.label.position.angle'
	}
	local rc = _rc
	if "`holdpos'" != "" {
		.style.label.position.setstyle , style(`holdpos')
	}
	if `rc' {
		exit `rc'
	}

	if 0`pos' == 0 {
		local shift 0

⌨️ 快捷键说明

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