在Stata中创建循环内的图形图例

时间:2015-07-21 19:10:16

标签: loops graph stata legend

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

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"))

有没有办法让这些年份作为循环的一部分出现在图例中?年份和年数从数据集变为数据集,这将有所帮助。

2 个答案:

答案 0 :(得分:2)

我的简短回答是我根本不会用循环绘制这样的图形。

这是一种方法:

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"))

答案 1 :(得分:1)

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

以下是我用来在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') )"

    }