📄 yxview.class
字号:
/* 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 + -