如何强制Stata在图形中的所有其他绘图上方放置一条水平线?

如何强制Stata在图形中的所有其他绘图上方放置一条水平线?,stata,graphing,Stata,Graphing,我正在绘制一个时间序列,并基于Windows7上Stata13.1中的布尔指示符变量对某些时间段进行着色。如果指示器变量等于1,则时间段将着色,如果缺少,则不着色。我想在y轴上时间序列等于0的点上画一条水平线。下面是一个示例,使用freduse插件(ssc安装freduse,替换): freduse GDPC1 USRECQ,清除 gen qrtr=qofd(日期) tsset qrtr,q 投递日期* 如果qrtr

我正在绘制一个时间序列,并基于Windows7上Stata13.1中的布尔指示符变量对某些时间段进行着色。如果指示器变量等于1,则时间段将着色,如果缺少,则不着色。我想在y轴上时间序列等于0的点上画一条水平线。下面是一个示例,使用
freduse
插件(
ssc安装freduse,替换
):

freduse GDPC1 USRECQ,清除
gen qrtr=qofd(日期)
tsset qrtr,q
投递日期*
如果qrtr
ly_dev
是时间序列,
USRECQ
是指标变量。实际上,指示符变量可以是任何东西,这就是为什么我不想在
twoway
命令中硬编码要着色的值,如或SSC中的
nber
插件所示。此代码生成以下图形:

水平线被阴影遮挡,因为阴影是首先创建的,但我需要首先创建阴影,否则,它会遮挡时间序列的绘图(因为Stata不支持透明度/alpha混合)


是否可以强制Stata将此水平线放置在图表中所有其他绘图的顶部

是;这是可以做到的。但你必须施加较小的力

本质上,
yline()
和类似选项背后的想法是提供参考线,这些参考线永远不会绘制在数据顶部

所以,要颠覆这一点,您必须提供您的行作为数据。一种方法是定义一个常量变量,并将其绘制成一个
直线
图形

下面的技术更一般,不假设添加的线需要是水平的

首先,为了方便起见,我们计算线的端点并将它们放在本地宏中。在其他例子中,这可能是可有可无的

local t1 = tq(1947q1)
local t2 = tq(2014q2) 
现在的关键是启动双向散射体,但要将两点(在本例中)重铸成一条直线。当我们提供两对坐标时,结果是一条直线(恰好是水平的)。您需要一条与第二个y轴上的0相对应的线:

对于类似的问题,人们应该能够根据每种情况下的数据计算出适当的坐标,或者使用绘制为水平线图的常量变量


编辑:修订版得益于Roberto Ferrer的评论

如果原始海报不喜欢手动输入数据,我认为为
scatteri
指定
yaxis(2)
选项以及零就足够了。对于直线的端点(局部变量
t1
t2
),他可以
总结qrtr
,并在局部变量中保存
r(min)
r(max)
。这对我来说适用于他的示例数据:
(scatteri 0`t1'0`t2',yaxis(2)重铸(线))
@Roberto Good points。请随意将您的评论编辑到我的答案中。我确信答案不需要辩护,但我想知道为什么投反对票。解决方案的核心就在那里。@Roberto Ferrer我注意到了这一点。不管你是谁,我都希望你能对这个问题做出更好的回答,或者你投否决票的理由。@NickCox谢谢你的回答。我个人的偏好是,在
scatteri
命令中指定
yaxis(2)
比手动将第二个轴上的0映射到第一个轴上的0.6更优雅,但无论如何,答案都非常有用。
local t1 = tq(1947q1)
local t2 = tq(2014q2) 
(scatteri 0 `t1' 0 `t2', recast(line) yaxis(2))