📄 bargraph_g.class
字号:
}
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 + -