我正在绘制时间序列并根据 Windows 7 上的 Stata 13.1 中的 bool 指标变量对某些时间段进行着色。如果指标变量等于 1,则对时间段进行着色,如果缺少则不着色。我想在 y 轴上时间序列等于 0 的点画一条水平线。这是一个例子,使用 freduse
插件( ssc install freduse, replace
):
freduse GDPC1 USRECQ, clear
gen qrtr = qofd(daten)
tsset qrtr, q
drop date*
drop if qrtr < tq(1947q1)
replace USRECQ = . if !USRECQ
label var USRECQ "Recession"
gen ly = log(GDPC1)
tsfilter hp lydev = ly, smooth(1600)
#delimit ;
twoway (scatter USRECQ qrtr,
recast(area)
bcolor(gs13)
cmissing(n)
yaxis(1)
ylabel(0 1)
yscale(off))
(tsline lydev,
yaxis(2)
yscale(alt axis(2))
ytitle("Deviation from trend", axis(2))),
yline(0, axis(2))
;
#delimit cr
ly_dev
是时间序列,USRECQ
是指示变量。在实践中,指标变量可以是任何东西,这就是为什么我不想硬编码值以在 twoway
中着色。命令,如 this Statalist post 中所示或 nber
SSC 中的插件。此代码生成此图:水平线被底纹遮住了,因为底纹是先创建的,但我需要先创建底纹,否则,它会遮住时间序列的图(因为 Stata 不支持透明度/alpha 混合)。
是否可以强制 Stata 将此水平线放置在图中所有其他图的顶部?
最佳答案
是的;这是可以做到的。但你必须施加轻微的力量。
本质上,背后的想法yline()
类似的选择是提供引用线,这些线永远不会绘制在数据之上。
所以,要颠覆你必须提供你的线作为数据。一种方法是定义一个常量并将其绘制为 line
图形。
下面的技术更通用,不假设添加的线需要是水平的。
首先为方便起见,我们计算线的端点并将它们放在局部宏中。在其他示例中,这可能是可有可无的。
local t1 = tq(1947q1)
local t2 = tq(2014q2)
现在关键是火起来
twoway scatteri
但是要将两个点(在这种情况下)重铸为一条线。当我们提供两对坐标时,结果是一条直线(恰好是水平的)。您需要一条与第二个 y 轴上的 0 对应的线:(scatteri 0 `t1' 0 `t2', recast(line) yaxis(2))
对于类似的问题,人们应该能够从每种情况下的数据计算适当的坐标,或者依靠绘制为水平线图的常量变量。
编辑:修订版受益于 Roberto Ferrer 的评论。
关于stata - 如何强制 Stata 在图表中的所有其他图上方放置一条水平线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26348614/