【问题标题】:How can I name several graphics in an iterative form?如何以迭代形式命名多个图形?
【发布时间】:2019-03-28 19:39:54
【问题描述】:

我有以下数据结构:

id id_name date observation
1    aa    2000     1
1    aa    2001     2
1    aa    2002     1
2    dd    2000     1.5
2    dd    2001     0
2    dd    2002     1

我使用下面的代码生成了几个线图:

forvalue i = 1/300 {
    graph twoway line observation date if id == `i', ///
    name("graph_`i'") title("?")
}

我的问题是我不知道如何将每个id 的名称(包含在变量id_name 中)作为每个图形的标题。

我尝试使用本地宏来实现这一点,但在 Stata 中我无法使用 if 来定义它:

local name = id_name if id == `i'

我设法做到以下几点:

forvalue i = 1/300 {
    sort id date
    local title = id_name 
    graph twoway line observation date if id == `i', ///
    name("graph_`i'") title("`title'")
    drop if id == `i'
}

但是,这样做的问题是在迭代的每一步都消除了数据。

如果有人能给我一些建议来解决这个问题,我将非常感激。

【问题讨论】:

  • 请注意,在 Stata 中没有局部变量,只有局部宏。这两个是不同的东西。

标签: plot graph stata stata-macros


【解决方案1】:

这是另一种方法,无耻地借鉴@Pearly Spencer 的示例。

了解一个观察结果就足够了,您要使用的名称存储为id_name 的值。找到第一个或最后一个这样的观察是最容易的。

clear
input id str2 id_name date observation
1    aa    2000     1
1    aa    2001     2
1    aa    2002     1
2    dd    2000     1.5
2    dd    2001     0
2    dd    2002     1
3    bb    2000     1.5
3    bb    2001     0
3    bb    2002     1
end

gen long obsno = _n 

forvalue i = 1 / 3 {
    su obsno if id == `i', meanonly 
    display `"graph twoway line observation date if id == `i', name("graph_`i'") title("`=id_name[r(min)]'")"'
}

另外一种比较满意的做法,因为后面有更多的应用,就是把id_name中的字符串值复制成id的值标签。 Stata Journal 中的labmask 会这样做。然后查找值标签是扩展宏功能的标准任务。

labmask id, values(id_name) 

forvalue i = 1 / 3 {
    display `"graph twoway line observation date if id == `i', name("graph_`i'") title("`: label (id) `i''")"'
}

【讨论】:

    【解决方案2】:

    这是一种方法:

    clear
    input id str2 id_name date observation
    1    aa    2000     1
    1    aa    2001     2
    1    aa    2002     1
    2    dd    2000     1.5
    2    dd    2001     0
    2    dd    2002     1
    3    bb    2000     1.5
    3    bb    2001     0
    3    bb    2002     1
    end
    
    mata: st_local("idnames", invtokens(st_sdata(., "id_name")'))
    
    local idnames : list uniq idnames
    tokenize `idnames'
    
    forvalue i = 1 / 3 {
        display `"graph twoway line observation date if id == `i', name("graph_`i'") title("``i''")"'
    }
    
    graph twoway line observation date if id == 1, name("graph_1") title("aa")
    graph twoway line observation date if id == 2, name("graph_2") title("dd")
    graph twoway line observation date if id == 3, name("graph_3") title("bb")
    

    这种方法的优点是您可以创建一个包含所有id_names 的列表(存储在本地宏idnames 中,以后可以在必要时重复使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多