📄 bargraph_g.class
字号:
c_local `drawnmac' 0`drawn'
end
program _draw_boxset
args j pos drawnmac has_pat i_g styledex
local gap = 0`.barsize' * `.graphstyle.gap.prop'
forvalues i = 1/0`.sersets[1].sers[`.vargroup'].categories' {
if 0`.shadevar' == 0`.vargroup' {
local styledex `._style_cat `=`j'+1''
local has_pat `._set_barstyle `styledex''
}
local drawme = serset(1, `=`j'+1') < . // median
.draw_box `=`pos'' `i' `j' 0`has_pat' `i_g' `styledex'
if (! `drawme') local drawme = serset(1, `j') < . // outside
if `drawme' | `.fill.istrue' {
scalar `pos' = `pos' + `.barsize' + `gap'
local drawn 1
}
}
if 0`drawn' | `.fill.istrue' {
scalar `pos' = `pos' - `gap'
}
c_local `drawnmac' 0`drawn'
end
program _sumrange_vargrp
args j
local beg = `j' + 1
local end = `j' + 0`.sersets[1].sers[`.vargroup'].categories'
local sumrange 0
forvalues i = `beg'/`end' {
if serset(1, `i') < . {
local sumrange = 0`sumrange' + abs(serset(1, `i'))
}
}
class exit = 0`sumrange'
end
program _style_cat
args j
local cat = serset(`.shadevar' , `j')
local i_cat = `.sersets[1].sers[`.shadevar'].vlab_pos_of `cat''
if (`i_cat' == 0) local i_cat `cat'
class exit = `i_cat'
end
program _set_barstyle
args i
if "`.barstyles[`i'].isa'" == "" {
.barstyles[`i'] = .seriesstyle.new, style(scheme p`i')
.SetIntensity `i'
}
if `.dotplot.istrue' {
.barstyles[`i'].marker.setgdifull
}
else {
.barstyles[`i'].area.setgdifull
}
local pat `.barstyles[`i'].area.linestyle.pattern.stylename'
class exit = ! ("`pat'" == "solid" | "`pat'" == "blank")
end
program _set_linestyle
args i
.barstyles[`i'].area.setlinestylefull
end
program _set_line_as_areastyle
args i
.barstyles[`i'].area.setlineasareafull
end
program _set_barsize
._get_grp_cts var grp sup
/* compute bars and gap sizes */
local bars = `var' * `grp' * `sup'
if `.fill.istrue' {
.barsize = 100 / (`bars' ///
+ `sup'*`grp'*(`var'-1) * `.graphstyle.gap.prop' ///
+ `sup'*(`grp'-1) * `.graphstyle.group_gap.prop' ///
+ (`sup'-1) * `.graphstyle.supgroup_gap.prop' ///
+ 2 * `.graphstyle.outer_gap.prop')
exit /* EXIT */
}
local bars 0
local n_grp 0
local n_sup 0
local real_grps 0
capture local c_grp = serset(`.group', 1)
capture local c_sup = serset(`.supergroup', 1)
forvalues j = 1/0`:serset N' {
if (serset(1, `j') >= .) continue
if (`.boxplot.istrue' & serset(`.boxsrt', `j') != 1) continue
local ++bars
if `c_grp' != serset(`.group', `j') | /*
*/ `c_sup' != serset(`.supergroup', `j') {
local ++real_grps
}
if `c_grp' != serset(`.group', `j') {
capture local c_grp = serset(`.group', `j')
if `bars' != 0`bars_grp' {
if `c_sup' == serset(`.supergroup', `j') {
local ++n_grp
}
}
local bars_grp `bars'
}
if `c_sup' != serset(`.supergroup', `j') {
capture local c_sup = serset(`.supergroup', `j')
if `bars' != 0`bars_sup' {
local ++n_sup
}
local bars_sup `bars'
}
}
local ++real_grps
if `.stack.istrue' {
.barsize = 100 / (`real_grps' ///
+ `n_grp' * `.graphstyle.group_gap.prop' ///
+ `n_sup' * `.graphstyle.supgroup_gap.prop' ///
+ 2 * `.graphstyle.outer_gap.prop')
}
else {
local n_var = `bars' - `n_sup' - `n_grp' - 1
.barsize = 100 / (`bars' ///
+ `n_var' * `.graphstyle.gap.prop' ///
+ `n_grp' * `.graphstyle.group_gap.prop' ///
+ `n_sup' * `.graphstyle.supgroup_gap.prop' ///
+ 2 * `.graphstyle.outer_gap.prop')
}
end
program _sort
if (! 0`.vargroup' & !0`.boxsrt') exit
if 0`.supergroup' {
local neg = cond(`.sup_asc_sort.istrue', "" , "-")
if (`.supsrt') local sort `neg'`.supsrt'
local sort `sort' `neg'`.supergroup'
}
if 0`.group' {
local neg = cond(`.grp_asc_sort.istrue', "" , "-")
if (`.grpsrt') local sort `sort' `neg'`.grpsrt'
local sort `sort' `neg'`.group'
}
local neg = cond(`.var_asc_sort.istrue', "" , "-")
if (`.varsrt') local sort `sort' `neg'`.varsrt'
local sort `sort' `neg'`.vargroup'
if (0`.boxsrt') local sort `sort' `.boxsrt' 1
.sersets[1].sort `sort'
end
program _reset_scaling
.sersets[1].set
local d = cond(`.horizontal.istrue', "x", "y")
.plotregion1.`d'scale.reinit
if `.stack.isfalse' & `.percentages.isfalse' {
.plotregion1.`d'scale.addmin `.sersets[1].sers[1].min'
.plotregion1.`d'scale.addmax `.sersets[1].sers[1].max'
if `.include0.istrue' {
.plotregion1.`d'scale.addmin 0
.plotregion1.`d'scale.addmax 0
}
.scaleaxis.set_ticks
exit /* EXIT */
}
local var = max(1, 0`.sersets[1].sers[`.vargroup'].categories')
local grp = max(1, 0`.sersets[1].sers[`.group'].categories')
local sup = max(1, 0`.sersets[1].sers[`.supergroup'].categories')
local min = cond(`.include0.istrue', 0 , 1e300)
local max = -1e300
local j 0
/* separate loops for speed */
if `.stack.istrue' {
forvalues i_s = 1/`sup' {
forvalues i_g = 1/`grp' {
local sum 0
local sng 0
local sumrng 0
forvalues i_v = 1/`var' {
if serset(1, `++j') < . {
if serset(1, `j') > 0 {
local sum = `sum' + serset(1, `j')
}
else local sng = `sng' + serset(1, `j')
if `.percentages.istrue' {
local sumrng = `sumrng' + abs(serset(1, `j'))
}
}
}
if `.percentages.istrue' {
if `sumrng' > 0 {
local sum = cond(`sumrng'!=., /*
*/ 100 * `sum' / `sumrng', -1e300)
local sng = cond(`sumrng'!=., /*
*/ 100 * `sng' / `sumrng', 0)
}
}
local max = max(`max', `sum')
local min = min(`min', `sng')
}
}
.plotregion1.`d'scale.addmin `min'
.plotregion1.`d'scale.addmax `max'
.scaleaxis.set_ticks
exit /* EXIT */
}
/* percentages, no stack */
local j 0
forvalues i_s = 1/`sup' {
forvalues i_g = 1/`grp' {
local sumrng 0
local min_g = cond(`.include0.istrue', 0 , 1e300)
local max_g -1e300
forvalues i_v = 1/`var' {
if serset(1, `++j') < . {
local max_g = max(`max_g', serset(1, `j'))
local min_g = min(`min_g', serset(1, `j'))
local sumrng = `sumrng' + abs(serset(1, `j'))
}
}
if `sumrng' > 0 {
local max = max(`max', `max_g'/`sumrng')
local min = min(`min', `min_g'/`sumrng')
}
}
}
local max = 100 * `max'
local min = 100 * `min'
.plotregion1.`d'scale.addmin `min'
.plotregion1.`d'scale.addmax `max'
.scaleaxis.set_ticks
end
// ---------------------------------------------------------------------------
program is_scale
args ord
class exit = cond(`.horizontal.istrue' , ("`ord'" == "x") , ///
("`ord'" == "y"))
end
/* -------------------------------------------------------------------------*/
/* Relable X axes on the graph
*/
program _relabel_xaxes
syntax [ , noLEGEND ]
.sersets[1].set
if `.stack.istrue' {
.varaxis.draw_view.set_false
}
else {
if `.graphstyle.label_vargroups.istrue' {
.varaxis.draw_view.set_true
}
}
.serset.set /* set the current serset */
._sort /* sort serset */
._set_barsize
if "`.supaxis.isa'" != "" { /* clear axes */
.supaxis.clear_ticks
}
if "`.grpaxis.isa'" != "" {
.grpaxis.clear_ticks
}
.varaxis.clear_ticks
_sort /* sort serset */
if ! `.fill.istrue' { /* unfilled version */
._relabx_nofill
if "`legend'" == "" {
.legend.rebuild , all
.legend.repositionkeys
}
exit /* EXIT */
}
._get_grp_cts base grp sup
._get_gaps gap_base gap_grp gap_sup gap_out
local n_b `.sersets[1].sers[`.vargroup'].categories'
if 0`.group' { /* xsize of a bar grouping */
if `.stack.istrue' {
local grp_sz = `.barsize'
}
else {
local grp_sz = `.barsize'*`n_b' + `gap_base'*(`n_b'-1)
}
}
else local grp_sz = 0
if 0`.supergroup' { /* xsize of a super grouping */
local supgrp_sz = `grp_sz'*`grp' + `gap_grp'*(`grp'-1)
}
else local supgrp_sz = 0
/* make labels */
local grpser sersets[1].sers[`.group']
local supser sersets[1].sers[`.supergroup']
local x `gap_out'
local j 1
forvalues i_s = 1/`sup' {
if 0`.supergroup' {
.supaxis.major.add_ticks `=`x'+`supgrp_sz'/2' /*
*/ `"`.`supser'.value_label `=serset(`.supergroup', `j')''"'
}
forvalues i_g = 1/`grp' {
._relabel_varset `x' `j'
if 0`.group' {
.grpaxis.major.add_ticks `=`x'+`grp_sz'/2' /*
*/ `"`.`grpser'.value_label `=serset(`.group', `j')''"'
}
if `i_g' != `grp' {
local x = `x' + `gap_grp'
}
local x = `x' + `grp_sz'
if `.boxplot.istrue' {
forvalues i_b = 1/`n_b' {
local j = `j' + 5
while serset(`.boxsrt', `j') == 9999 {
local ++j
}
}
}
else local j = `j' + `n_b'
}
local x = `x' + `gap_sup'
}
if "`legend'" == "" {
.legend.rebuild , all
.legend.repositionkeys
}
if `.showvaraxis.istrue' & "`.grpaxis.isa'" != "" {
.grpaxis.style.editstyle linestyle(none) editcopy
}
end
program _relabx_nofill
.sersets[1].set
._get_gaps gap_var gap_grp gap_sup gap_out
if `.stack.istrue' {
local gap_var 0
local back_var 0
}
else {
local back_var `gap_var'
}
local grpser sersets[1].sers[`.group']
local supser sersets[1].sers[`.supergroup']
local varser sersets[1].sers[`.vargroup']
capture local c_grp = serset(`.group', 1)
capture local c_sup = serset(`.supergroup', 1)
local lab_grp `"`.`grpser'.value_label `c_grp''"'
local lab_sup `"`.`supser'.value_label `c_sup''"'
local x_grp `gap_out'
local x_sup `gap_out'
local x `gap_out'
local N1 = 0`:serset N' + 1
forvalues j = 1/`N1' {
if (`.boxplot.istrue' & `j' != `N1' & ///
serset(`.boxsrt', `j') != 1) continue
if `c_grp' != serset(`.group', `j') | ///
`c_sup' != serset(`.supergroup', `j') {
if 0`new_grp' {
.grpaxis.major.add_ticks ///
`=(`x'+`x_grp'-`back_var')/2' `"`lab_grp'"'
local x = `x' + `gap_grp' - `gap_var'
local x_grp `x'
local new_grp 0
}
capture local c_grp = serset(`.group', `j')
local lab_grp `"`.`grpser'.value_label `c_grp''"'
}
if `c_sup' != serset(`.supergroup', `j') {
if 0`new_sup' {
local x = `x' - `gap_grp'
.supaxis.major.add_ticks `=(`x'+`x_sup')/2' `"`lab_sup'"'
local x = `x' + `gap_sup'
local x_grp `x'
local x_sup `x'
local new_sup 0
}
capture local c_sup = serset(`.supergroup', `j')
local lab_sup `"`.`supser'.value_label `c_sup''"'
}
if `.stack.istrue' {
if `c_grp' != 0`cur_grp' {
local shifted 0
local cur_grp `c_grp'
}
if serset(1, `j') < . & !0`shifted' {
local x = `x' + `.barsize'
local shifted 1
local new_grp 1
local new_sup 1
}
}
else {
if serset(1, `j') < . {
if `.graphstyle.label_vargroups.istrue' & ///
! `.stack.istrue' {
local lab ///
`.`varser'.value_label `=serset(`.vargroup',`j')''
.varaxis.major.add_ticks ///
`=`x'+`.barsize'/2' `"`lab'"'
}
local x = `x' + `.barsize' + `gap_var'
local new_grp 1
local new_sup 1
}
}
}
end
program _relabel_varset
args x j0
.sersets[1].set
if ! `.graphstyle.label_vargroups.istrue' | `.stack.istrue' {
exit /* EXIT */
}
local bars = max(1, 0`.sersets[1].sers[`.vargroup'].categories')
local gap = `.barsize' * `.graphstyle.gap.prop'
local series sersets[1].sers[`.vargroup']
local x = `x' + `.ba
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -