在 Stata 循环内创建图形图例

Create graph legend inside loop in Stata

我想为不同的数据集生成图表,具有相同的变量,但年份会发生变化。到目前为止,我可以生成没有图例的图表,这样做:

levelsof year, local(lyear)
foreach l of local lyear {
    local fig `fig' scatter mpg time if year==`l', connect(l) ||    
}
graph twoway `fig' 

我想添加一个每年显示的图例。例如,如果没有循环,我会添加选项:

graph twoway `fig',  legend(lab(1 "2010") lab(2 "2011") lab(3 "2012"))

有没有办法让年份作为循环的一部分出现在图例中?年份和年数随数据集的不同而变化,这会很有帮助。

我的简短回答是,我根本不会画这样一个带有循环的图。

这是一种方法:

separate mpg, by(year) veryshortlabel 
twoway connected `r(varlist)' time, sort 

这是另一种方法:

ssc inst sepscatter 
sepscatter mpg time, sep(year) recast(connected) sort

您只需安装 sepscatter 一次。

详情:这个

legend(lab(1 "2010") lab(2 "2011") lab(3 "2012"))

更容易
legend(order(1 "2010" 2 "2011" 3 "2012"))

这不是对上面(可能更好)答案的评论,但为了将来参考,您可以使用本地宏做各种奇妙的事情。只需构建一个更新年份(或其他任何内容)的循环,然后将其放入宏中并将宏用于选项。

这是我用来在 Stata 中生成地毯图的 example 的片段。

    foreach llevel of local llevels {
        local pposition: list posof "`llevel'" in llevels
        local rposition = `ssize'-`pposition'+1
        local iintensity=1-(0.7*((`rposition')/`maxlevels'))
        local rrug "`rrug' (scatter rugzero `rugvar'" 
        local rrug "`rrug' if `rugvar'_pickone &"
        local rrug "`rrug' `rugvar'_cat==`llevel' & `my_touse',"
        local rrug "`rrug' xaxis(`axis') msymbol(none) mlab(ruglabel)"
        local rrug "`rrug' mlabcolor(*`iintensity')"
        local rrug "`rrug' mlabposition(`clock') )"

    }