📄 piegraph_g.class
字号:
}
gettoken unused : what , qed(quoted) // what to show
if (`quoted') local labtype text
else local labtype `what'
if `"`tstyle'"' == `""' { // style info
local tstyle `.style.pielabel_style.stylename'
}
if `"`position'"' == `""' {
local position `.style.pielabel_pos.stylename'
}
if `"`format'"' == `""' {
local format `.style.pielabel_format'
}
if `"`gap'"' == `""' {
local gap `.style.pielabel_gap.val'
}
else {
tempname gapstyle
.`gapstyle' = .gsize.new, style(`.style.pielabel_gap.val')
.`gapstyle'.setstyle , style(`gap')
local gap `.`gapstyle'.val'
}
// create textbox(s)
if `all' {
.sersets[1].set
forvalues dex = 1/0`:serset N' {
.MakePlabel "`dex'" "`labtype'" `"`format'"' `"`position'"' ///
`"`gap'"' `"`what'"' `"`tstyle'"' `"`options'"'
}
}
else {
.MakePlabel "`dex'" "`labtype'" `"`format'"' `"`position'"' ///
`"`gap'"' `"`what'"' `"`tstyle'"' `"`options'"'
}
end
/*
program _parse_pie_full
syntax anything(name=wedges id=pie) [ , Color(string) ///
EXPLODE EXPLODE1(string) Label(string asis) ]
// which wedges
if `"`wedges'"' == "_all" {
.sersets[1].set
local wedges "1/`:serset N'"
}
capture numlist `"`wedges'"' , integer range(>0)
if _rc {
di as error `"invalid wedge numbers in pie(), `wedges'"'
exit 198
}
local wedges "`r(numlist)'"
// label() subotion
if `"`label'"' != `""' {
local 0 `"`label'"'
syntax anything(name=lbl id=label) [ , POSition(string) ///
GAP(string) FORmat(string) TSTYle(string) * ]
gettoken unused : lbl , qed(quoted) // what to show
if (`quoted') local labtype text
else local labtype `lbl'
if `"`tstyle'"' == `""' { // style info
local tstyle `.style.pielabel_style.stylename'
}
if `"`position'"' == `""' {
local position `.style.pielabel_pos.stylename'
}
if `"`format'"' == `""' {
local format `.style.pielabel_format'
}
if `"`gap'"' == `""' {
local gap `.style.pielabel_gap.val'
}
else {
tempname gapstyle
.`gapstyle' = .gsize.new, ///
style(`.style.pielabel_gap.val')
.`gapstyle'.setstyle , style(`gap')
local gap `.`gapstyle'.val'
}
}
// create and apply
foreach dex of local wedges {
if `dex' > `:serset N' {
di in green "(`dex' exceeds number of pie wedges, ignored)"
continue
}
if "`.piestyles[`dex'].isa'" == "" { // safety
.piestyles[`dex'] = .areastyle.new, style(scheme p`dex')
.SetIntensity `dex'
}
if `"`color'"' != `""' { // color
.piestyles[`dex'].editstyle shadestyle(color(`color')) editcopy
}
if "`explode'`explode1'" != "" { // explosion
if ("`.style.explode_gap.stylename'" == "") {
local expstyle `.style.explode_gap.stylename'
}
else {
local expstyle `.style.explode_gap.val'
}
.explodes[`dex'].ref = .gsize.new , style(`expstyle')
if `"`explode1'"' != `""' {
.explodes[`dex'].setstyle , style(`explode1')
}
}
if `"`label'"' != `""' { // label
.MakePlabel "`dex'" "`labtype'" `"`format'"' `"`position'"' ///
`"`gap'"' `"`what'"' `"`tstyle'"' `"`options'"'
}
}
end
*/
program MakePlabel
gettoken dex 0 : 0
gettoken labtype 0 : 0
gettoken format 0 : 0
gettoken pos 0 : 0
gettoken gap 0 : 0
gettoken mtext 0 : 0
gettoken tstyle 0 : 0
gettoken txt_opts 0 : 0
.sersets[1].set
if `dex' > `:serset N' {
di in green "`dex' larger than number of pie wedges, ignored"
exit
}
if (serset(2,`dex') == 0) exit
local il = 0`.plabel.arrnels' + 1 // new label index
if "`labtype'" != "text" { // label text
local 0 , `labtype'
syntax [ , SUM PERcent NAme None * ]
local labtype `sum' `percent' `name' `none' `options'
if "`labtype'" == "name" {
local idex = serset(3,`dex')
local mtext `"`.sersets[1].sers[3].value_label `idex''"'
}
else if "`labtype'" == "sum" {
local mtext = string(serset(1,`dex') , "`format'")
}
else if "`labtype'" == "percent" {
local mtext = string(100 * serset(2, `dex') / 360, ///
"`format'") + "%"
}
else if "`labtype'" == "none" {
exit
}
else {
di as error `"not a plabel() type , `labtype'"'
exit 198
}
}
// radius and gap
.plab_gap[`il'] = `gap'
if "`pos'" == "inside" {
.plab_radius[`il'] = 2 / 3
}
else if "`pos'" == "outside" {
.plab_radius[`il'] = 1
}
else {
di as error `"invalid position(), `pos'"'
exit 198
}
// create textbox
.plabel[`il'] = .pos_textbox.new , mtext(`mtext') ///
forcesized style(`tstyle')
.plab_dex[`il'] = `dex'
tempname log
.`log' = {}
local 0 `", `options'"'
_fr_sztextbox_parse_and_log `log' plabel[`il'] , `txt_opts'
local 0 `", `r(rest)'"'
syntax [, FAKE_OPT_FOR_BETTER_MSG ]
_fr_runlog `log' , nologging
end
program ParsePtext , rclass
syntax [ , PText(string asis) * ]
while `"`ptext'"' != `""' {
._parse_ptext `ptext'
local 0 `", `options'"'
syntax [ , PText(string asis) * ]
}
return local rest `"`options'"'
end
program _parse_ptext
syntax [ anything(name=triplets) ] [ , TSTYle(string) * ]
if `"`tstyle'"' == `""' {
local tstyle "scheme text_option"
}
// create the textboxes
tempname log
gettoken angle triplets : triplets
gettoken radius triplets : triplets
while `"`radius'"' != `""' {
capture numlist "`angle' `radius'" , max(2) min(2)
if _rc {
di as error `"invalid point, `angle' `radius'"'
exit 198
}
gettoken txtq triplets : triplets , quotes // text
gettoken txt : txtq
while `"`txtq'"' != `""' & `"`txtq'"' != `"`txt'"' {
local mtext `"`mtext' `txtq'"'
gettoken txtq triplets : triplets , quotes
gettoken txt : txtq
}
local i_b = 0`.ptext.arrnels' + 1
.ptext[`i_b'] = .pos_textbox.new , mtext(`mtext') ///
forcesized style(`tstyle')
.boxpos[`i_b'] = "`angle' `radius'"
local mtext
.`log' = {}
_fr_sztextbox_parse_and_log `log' ptext[`i_b'] , `options'
local 0 `", `r(rest)'"'
syntax [, FAKE_OPT_FOR_BETTER_MSG ]
_fr_runlog `log' , nologging
local angle `txt'
gettoken radius triplets : triplets
}
end
// ----------------------------------------------------------------------------
// Returns the mid-point (in radians) of the supplied wedge index.
program MidAngle
args dex
local angle0 `.style.angle0.val'
local op = cond(`.style.clockwise.istrue' , "-" , "+")
forvalues i=1/0`=`dex'-1' {
local angle0 = `angle0' `op' serset(2, `i')
}
class exit = 2 * _pi * (`angle0' `op' serset(2, `dex') / 2) / 360
end
// ----------------------------------------------------------------------------
// Draws a pie
program drawpie
syntax [ , XSize(real 1) YSize(real 1) * ]
local radius0 = min(`xsize' , `ysize') / 2
.radius = .Radius `radius0'
.sersets[1].set
local x0 = `xsize' / 2
local y0 = `ysize' / 2
local angle0 `.style.angle0.val'
local op = cond(`.style.clockwise.istrue' , "-" , "+")
forvalues i=1/0`:serset N' {
if (`=serset(2 , `i')' <= 0) continue
local angle = `angle0' `op' serset(2 , `i')
if 0`.explodes[`i'].val' {
local mid = _pi * (`angle' + `angle0') / 360
local y = `y0' + sin(`mid') * `.explodes[`i'].gmval'
local x = `x0' + cos(`mid') * `.explodes[`i'].gmval'
}
else {
local x `x0'
local y `y0'
}
.piestyles[`i'].setgdifull
if "`.style.linestyle.color.stylename'" == "none" {
.piestyles[`i'].shadestyle.setgdipenfull , ///
linewidth(.000001) nointensity
}
else .style.linestyle.setgdifull
if `angle0'+`angle' < . {
if (`.style.clockwise.istrue') {
gdi pieslice `x' `y' `.radius' `angle' `angle0'
}
else {
gdi pieslice `x' `y' `.radius' `angle0' `angle'
}
}
local angle0 `angle'
}
.DrawPtext `x0' `y0'
.DrawPlabels `x0' `y0'
end
program Radius
args base
class exit `base' - 0`.MaxExplode'
end
program MaxExplode
forvalues i = 1/0`.explodes.arrnels' {
local max = max(0`max' , 0`.explodes[`i'].gmval')
}
class exit = `max'
end
program DrawPtext
args x0 y0
forvalues i = 1/0`.ptext.arrnels' {
tokenize `.boxpos[`i']'
local angle = 2 * _pi * `1' / 360
local y = `y0' + sin(`angle') * `2'
local x = `x0' + cos(`angle') * `2'
.ptext[`i'].setpos , xpos(`x') ypos(`y')
.ptext[`i'].draw
}
end
program DrawPlabels
args x0 y0
forvalues i = 1/0`.plabel.arrnels' {
local dex `.plab_dex[`i']'
local radius = `.radius'*`.plab_radius[`i']' + ///
0`.plab_gap[`i']' + 0`.explodes[`dex'].gmval'
local angle `.MidAngle `dex''
local y = `y0' + sin(`angle') * `radius'
local x = `x0' + cos(`angle') * `radius'
.plabel[`i'].setpos , xpos(`x') ypos(`y')
.plabel[`i'].draw
}
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -