📄 yxview.class
字号:
}
else {
local shift = `.style.marker.size.gmval' / 2 + ///
`.style.label.textgap.gmval'
}
local xshift = `shift' * cos(`angle')
local yshift = `shift' * sin(`angle')
if (`drawn') { // draw point
gdi point `x' `y'
}
else {
gdi moveto `x' `y'
}
if `"`label'"' == `""' {
exit
}
gdi gm_rmoveto `xshift' `yshift' // offset for labels
local label `label'
gdi ctext `label'
end
program _draw_styled_points
.style.marker.setgdifull // in case
local drawn0 0`.style.marker.drawn'
forvalues j = 1/`:serset N' {
capture .obs_styles[`j'].marker.setgdifull
if _rc {
local drawn `drawn'
}
else {
local drawn 0`.obs_styles[`j'].marker.drawn'
}
if `drawn' {
gdi point `=serset(`.xvar', `j')' `=serset(`.yvar', `j')'
}
}
end
program _draw_weighted_points
if (! 0`.style.marker.drawn') exit
if 0`.serset[`.wvar'].min' < 0 {
di as error "negative weights not allowed, plot ignored"
exit
}
local wtseries serset.sers[`.wvar']
local max = 0`.`.`.plotregion'.graphs[1]'.style.max_wted_symsize.gmval'
local max = cond(`max' , `max', 10)
local scale = 1.5 / sqrt(`.`wtseries'.min')
// 1.5 std symsize
if `scale' * sqrt(`.`wtseries'.max') > `max' {
local scale = `max' / sqrt(`.`wtseries'.max')
}
.style.marker.setgdifull
gdi jitterseed = `.jitterseed'
gdi gm_jitter = `.jitter'
gdi scatterweight `.serset.id' `.xvar' `.yvar' `.wvar' `scale'
gdi gm_jitter = 0
end
// ---------------------------------------------------------------------------
// Currently unique to bar views (and to a lesser extent spike, dropline, and
// dot). Returns the minimum/maximum point (in the metric of ord) that the
// view will attempt to draw to.
program min_range
args ord
class exit "`.minmax_range `ord' min'"
end
program max_range
args ord
class exit "`.minmax_range `ord' max'"
end
program minmax_range
args ord minmax
if "`ord'" != "`.bar_drop_to.stylename'" {
class exit "`.base'"
}
if "`.type.stylename'" == "rbar" | ///
("`.type.stylename'" == "bar" & "`.bartype.stylename'" == "fixed") {
local series serset.sers[`.xvar']
local op = cond("`minmax'" == "min" , "-" , "+")
class exit "`=`.serset.sers[`.xvar'].`minmax'' `op' `.bar_size'/2'"
}
class exit "."
end
program register_with_scale
if "`.plotregion.isa'" == "" {
exit
}
if `.base' < . {
local ord = cond("`.bar_drop_to.stylename'" == "x", "y", "x")
.`.plotregion'.`ord'scale.add_view `.objkey'
}
/* delete
if "`.type.stylename'" != "bar" {
class exit (.)
}
if "`.bartype.stylename'" != "fixed" {
class exit (.)
}
*/
local ord `.bar_drop_to.stylename'
.`.plotregion'.`ord'scale.add_view `.objkey'
end
// ---------------------------------------------------------------------------
program next_default_series
class exit = `.`.`.plotregion'.graphs[1]'.n_views' + 1
end
// ---------------------------------------------------------------------------
// Set the type of the view, recreate the object if necessary.
program _set_type
args type
if "`type'" == "`.type.setting'" {
exit
}
.type.setstyle, style(`type')
tempname pnm // direct tie into twoway
capture cutil which twoway_`1'_parse
if _rc { // default parser
.`pnm' = .twoway_yxview_parse.new
}
else { // custom parser
.`pnm' = .twoway_`type'_parse.new
}
if "`.`pnm'.isa'" == "" {
di as error "`1' not supported"
exit 198
}
if "`.classname'" == "`.`pnm'.viewclass'" { // same class
exit // we're done
}
if "`.classname'" == "y2xview_g" & "`.`pnm'.viewclass'" == "yxview" {
exit // lesser class
}
if "`.`.plotregion'.isa'" == "" { // impossible
di as error "cannot retype/reclass, plotregion not stored"
exit 198
}
tempname self serset // find and "delete" ourself
.`self' = .ref // dangerous, keep ref to self
.`serset' = .serset.ref // so names still resolve
local preg `.`self'.plotregion'
// could hold a tempstyle and loop if "`.stylename'" == ""
forvalues i = 1/0`.`preg'.dynamicmv.arrnels' {
if "`.`preg'.dynamicmv[`i'].uname'" == "`.uname'" {
_cls nameof `.`preg'.objkey' dynamicmv[`i']
local name `r(name)'
.`preg'.`name'.ref = NULLKEY
continue, break
}
}
if "`name'" == "" { // impossible
di as error "cannot retype, view not found"
exit 198
}
// create new view
tempname log
.`log' = {}
.`pnm'.viewtype = "`type'"
.`pnm'.log_create_view , log(`log') name(`name') ///
plotregion(`.`preg'.objkey') serset(`serset') ///
yvar(`.`self'.yvar') xvar(`.`self'.xvar') ///
wvar(`.`self'.wvar') style(`.style.stylename')
_fr_runlog `log' , nologging
/*
.`pobj`i''.log_create_view , log(`log') view(`j') ///
name(plot`++plotid') plotregion(`plreg`i'') ///
serset(sersets[`serset`i'']) seriesid(`++serid')
*/
/*
.`preg'.Declare `name' = .`pnm'.log_create_view, ///
yvar(`.`self'.yvar') xvar(`.`self'.xvar') ///
wvar(`.`self'.wvar') style(`.style.stylename') ///
serset(`serset') plotregion(`.`preg'.objkey')
*/
/*
.`preg'.`name'._set_to_active_context // dangerous
*/
end
/* -------------------------------------------------------------------------*/
/* add a xyview based on the current setting of .addview.
May use T_Name containing the full name of the xyview if view does not
hold plotregion and plotregion graph.
*/
program _set_addview
gettoken xytype options : 0 , parse(" ,")
if "`xytype'" == "none" {
exit
}
.addview.setstyle , style(none) /* always none */
if "`.`.plotregion'.graphs[1]'" == "" {
._last_xyandplotreg graph plotregion : $T_Name /* get names */
if "`plotregion'" != "" & "`graph'" != "" {
.set , plotregion(`plotregion')
.`plotregion'.set , graph(`graph')
}
else {
di in white "graph or plotregion not defined for view"
exit 198
}
}
if "`.Local.serset.isa'" == "" {
di in white "cannot add view, view does not reference its serset"
exit
}
if "`xytype'" == "median_bands" | "`xytype'" == "splined_medians" {
._run_derived `xytype' `options'
exit /* EXIT */
}
preserve /* use the serset */
.Local.serset.set
drop _all
serset use
/* add view */
._run_`xytype' `.serset.sers[`.xvar'].name' /*
*/ `.serset.sers[`.yvar'].name' `options'
end
/* -------------------------------------------------------------------------*/
program _last_xyandplotreg
args xymac plregmac colon rest
if "`0'" != "nogscope" {
local name gscope
}
gettoken tok rest : rest , parse(" .")
while "`rest'" != "" {
if 0`.`name'.isofclass graph_g' {
local graph `name'
}
if 0`.`name'.isofclass plotregion' {
local plotregion `name'
}
if "`tok'" != "." {
local name `name'.`tok'
}
gettoken tok rest : rest , parse(" .")
}
local last `tok' /* assumes no trailing .'s */
c_local `xymac' `graph'
c_local `plregmac' `plotregion'
end
/* -------------------------------------------------------------------------*/
program _run_derived
gettoken xytype options : 0 , parse(" ,")
if "`xytype'" == "median_bands" {
local type median_bands
}
else local type spline
tempname derived
.`derived' = .derived_serset.new , base(`.serset.objkey') ///
type(`type') x(`.xvar') y(`.yvar') `options'
.`derived'.set
.`derived'.sort 2
.`.`.plotregion'.graphs[1]'.addplots line ///
`.serset.nameof `.yvar'' `.serset.nameof `.xvar'' , ///
useplotregion(`.`.plotregion'.objkey') ///
serset(`.`derived'.objkey'.ref) nologging notitling
end
/* -------------------------------------------------------------------------*/
/* member programs to create new views
most could just become simple addplots of the appropriate type.
*/
program _run_regression_line
gettoken x 0 : 0 , parse(" ,")
gettoken y 0 : 0 , parse(" ,")
syntax [ , ATobs POINTs(integer 300) ]
qui regress `y' `x'
if "`atobs'" == "" {
summarize `x' , meanonly
drop _all
qui set obs `points'
qui gen `x' = r(min) + (_n-1)*(r(max) - r(min)) / (`points' -1)
}
else {
drop `y'
}
._add_regression `x' `y'
end
program _run_quadratic_regression
gettoken x 0 : 0 , parse(" ,")
gettoken y 0 : 0 , parse(" ,")
syntax [ , ATobs POINTs(integer 300) ]
tempname x2
gen double `x2' = `x'*`x'
qui regress `y' `x' `x2'
if "`atobs'" == "" {
summarize `x' , meanonly
drop _all
qui set obs `points'
qui gen `x' = r(min) + (_n-1)*(r(max) - r(min)) / (`points' - 1)
qui gen double `x2' = `x'*`x'
}
else {
drop `y'
}
._add_regression `x' `y'
end
program _run_fractional_polynomial
gettoken x options : 0 , parse(" ,")
gettoken y options : options , parse(" ,")
qui fracpoly regress `y' `x' `options'
_add_regression `x' `y' fracpred
end
program _add_regression
args x y predict
if "`predict'" == "" {
local predict predict
}
tempname yhat
qui `predict' `yhat'
if `.conf_interval.isfalse' {
.`.`.plotregion'.graphs[1]'.addplots line `yhat' `x' , ///
sort(`x') useplotregion(`.`.plotregion'.objkey') ///
nologging notitling
exit
}
if `.ci_of_expected.istrue' | "`predict'" == "fracpred" {
local se_method stdp
}
else local se_method stdf
tempname se min max
qui `predict' `se' , `se_method'
qui gen `min' = `yhat' - invttail(e(df_r), ((100-c(level))/200)) * `se'
qui gen `max' = `yhat' + invttail(e(df_r), ((100-c(level))/200)) * `se'
label variable `min' "`c(level)'% CI"
label variable `max' "`c(level)'% CI"
// local lstyle p`.`.`.plotregion'.plot1.next_default_series'
local cistyle ci
.`.`.plotregion'.graphs[1]'.addplots ///
rarea `min' `max' `x' , sort(`x') pstyle(`cistyle') || ///
line `yhat' `x', sort(`x') ///
useplotregion(`.`.plotregion'.objkey') ///
nologging notitling
// .`.`.plotregion'.graphs[1]'.addplots line `yhat' `min' `max' `x' , ///
// sort(`x') useplotregion(`.`.plotregion'.objkey') ///
// pstyle(. `cistyle' `cistyle') nologging notitling
end
program _run_ksm_mean
gettoken x options : 0 , parse(" ,")
gettoken y options : options , parse(" ,")
tempname yhat
ksm `y' `x' , gen(`yhat') nograph , `options'
label variable `yhat' "ksm, mean `options'"
.`.`.plotregion'.graphs[1]'.addplots line `yhat' `x' , sort(`x') ///
useplotregion(`.`.plotregion'.objkey') nologging notitling
end
program _run_ksm_line
gettoken x options : 0 , parse(" ,")
gettoken y options : options , parse(" ,")
tempname yhat
ksm `y' `x' , gen(`yhat') line nograph , `options'
label variable `yhat' "ksm, line `options'"
.`.`.plotregion'.graphs[1]'.addplots line `yhat' `x' , sort(`x') ///
useplotregion(`.`.plotregion'.objkey') nologging notitling
end
program _run_ksm_lowess
gettoken x options : 0 , parse(" ,")
gettoken y options : options , parse(" ,")
tempname yhat
ksm `y' `x' , gen(`yhat') lowess nograph , `options'
label variable `yhat' "ksm, lowess `options'"
.`.`.plotregion'.graphs[1]'.addplots line `yhat' `x' , sort(`x') ///
useplotregion(`.`.plotregion'.objkey') nologging notitling
end
/* now uses _run_derived
program _run_median_bands
args x y
.`.`.plotregion'.graphs[1]'.addview `y' `x' , c(m) s(i) sort(`x') ///
name(median_bands) plotregion(`.`.plotregion'.objkey') nolog
end
program _run_splined_medians
args x y
.`.`.plotregion'.graphs[1]'.addview `y' `x' , c(s) s(i) sort(`x') ///
name(splined_medians) plotregion(`.`.plotregion'.objkey') nolog
end
*/
// ---------------------------------------------------------------------------
// Handle grouping and ungrouping (shattering) the styles for the
// observations. Note that many views may ignore that ungrouping has
// occured, only those using _draw_points are assured to use the information
program _set_grouped
args grouped
if "`grouped'" == "`.grouped.setting'" {
exit
}
.grouped.setstyle, style(`grouped')
if "`grouped'" == "yes" { // signal to ungroup
while 0`.obs_styles.arrnels' {
.obs_styles.Arrpop
}
exit // Exit
}
if 0`.obs_styles.arrnels' {
exit // Nothing to do, exit
}
if "`.obs_styles.isa'" == "" {
.Declare array obs_styles
}
forvalues j = 1/`:serset N' {
.obs_styles[`j'] = .`.style.classname'.new , style(`.style.snm')
}
end
// ---------------------------------------------------------------------------
// command logged by parse to allow connect() option to over-ride type.
program _maybe_override_type
if "`.type.stylename'" == "scatter" {
.type.setstyle , style(connected)
}
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -