如何以迭代形式命名多个图形?
How can I name several graphics in an iterative form?
我有以下数据结构:
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'
}
但是,问题是在迭代的每一步都消除了数据。
如果有人能给我一些建议来解决这个问题,我将不胜感激。
这是一种方法:
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
中,您可以在以后需要时重新使用。
这是另一种方法,无耻地借鉴@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''")"'
}
我有以下数据结构:
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'
}
但是,问题是在迭代的每一步都消除了数据。
如果有人能给我一些建议来解决这个问题,我将不胜感激。
这是一种方法:
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
中,您可以在以后需要时重新使用。
这是另一种方法,无耻地借鉴@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''")"'
}