Stata绘图:唯美的函数图-自定义水平附加线和竖直附加线

发布时间:2022-09-24 阅读 700

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 连玉君 (中山大学)
邮箱: arlionn@163.com

1. 简介

本文 dofiles 下载:
连享会 / 实证分析可视化-本文 dofiles-

绘制图形时,经常需要添加一些辅助线来提高可图形的可读性 (参见 Stata绘图:在图片中添加虚线网格线 )。例如,我们像绘制如下图形 (代码附后):

图 1

这里的灰色辅助虚线应该如何添加呢?

显然,问题的关键是:我们要能够控制辅助虚线的 位置长短

2. yline() 和 xline() 选项无法奏效

大家首先想到的可能是 yline()xline() 选项,命令如下:

twoway                                  ///
  function y=2*x , range(0 4) lp(solid) ///
           yline(2, lp(dash))           ///
           yline(6, lp(dash) noextend)  ///
           xline(1, lp(dash))           ///
           xline(3, lp(dash) noextend)  ///
           aspect(0.8) 
graph export "function_addline_02.png", ///
      width($width) replace 

输出结果为:

图 2

这显然不符合我们的要求:能确定位置,但无法控制长短。因为 Stata 默认辅助线会贯穿横轴或纵轴变量的取值范围,即占满绘图区。详情可以参阅帮助文件:help graph ylinehelp added_line_options

注意,即使我们附加了 noextend 子选项,也仅仅是确保附加线不从 (inner graph region) 延伸到 (outer graph region) (有关 Stata 图形区域的界定,参见 help region_options 或 PDF 手册 [G-3] region_options)。

#d ;
global dash "lp(dash) lc(gray) lw(*0.6)";
twoway 
  (function y=2*x , range(0 4) lp(solid))
  (function y=2, range(0 1) $dash) 
  (function y=1, range(0 2) $dash horizontal) 
  (function y=6, range(0 3) $dash) 
  (function y=3, range(0 6) $dash horizontal)   
  ,
  ylabel(, nogrid)
  aspect(0.8) 
  legend(off);
#d cr 
graph export "function_addline_01.png", ///
      width($width) replace  

3. 使用 twoway function 命令

Stata 的 twoway function 命令可以绘制函数图,借助它我们可以精准地定义辅助虚线的位置和长短。先看两个简单的例子。

例 1: 定义一条水平辅助线。位置:y=3,长度:y[0.5,3]。命令如下:

*-水平辅助线
twoway function y=3,            ///
       range(0.5 3) xlabel(0(1)4) ylabel(0(1)4)

输出效果:

图 3a

例 2: 定义一条垂直辅助线。位置:x=3,长度:y[0.5,3]。命令如下:

*-垂直辅助线
twoway function y=3, horizontal ///
       range(0.5 3) xlabel(0(1)4) ylabel(0(1)4)

输出效果:

图 3b

有些读者可能会想,能否用 twoway function x=3 来定义上图中的垂直辅助线呢?答案是:这种方式可以绘制一条贯穿整个绘图区的竖线,但无法限定其取值范围。

命令 twoway function y=3, horizontal 的巧妙之处在于,通过附加 horizontal 选项来实现垂直辅助线的绘制,但由于函数形式本身还是 function y=3,我们仍然可以通过 range(0.5 3) 来限定 x 的取值范围。

事实上,我们可以换个角度理解这问题。附加 horizontal 选项后,纵轴变成的了 x,因此此时 range(0.5 3) 选项相当于在设定纵轴的取值范围。

此时,你完全可以自行绘制 图 1 了。

图 1 的 Stata 代码:

#d ;
global dash "lp(dash) lc(gray) lw(*0.6)";
twoway 
  (function y=2*x , range(0 4) lp(solid))
  (function y=2, range(0 1) $dash) 
  (function y=1, range(0 2) $dash horizontal) 
  (function y=6, range(0 3) $dash) 
  (function y=3, range(0 6) $dash horizontal)   
  ,
  ylabel(, nogrid)
  aspect(0.8) 
  legend(off) ;
#d cr 

4. 例子:正态分布的密度函数图和分布图

下面这幅图呈现了标准正态分布的密度函数 ϕ() 和累积分布函数 Φ() 之间的一一对应关系。该图有助于理解基于服从均匀分布的随机数产生服从标准正态分布随机数的机制。

图 4

你能找出图中是如何应用本文中的绘图技巧的吗?

*--------------------------------------
* set scheme scientific 
#d ;
twoway
  (function y = 1.2 +normal(x), range(-4 +4)   lp(solid) lc(blue))
  (function y = 2*normalden(x), range(-4 +4)   lp(solid))            
  (function y = 2*normalden(x), range(-4 -0.6) lp(solid)  
                       recast(area) color(balck*0.6%30))
  (function y = 1.2 +normal(-0.6), 
            range(-4 -0.6) lp(dash) lc(gray) lw(*0.6))
  (function y =-0.6, 
            range(0 1.4742) horizontal lp(dash)   lc(gray) lw(*0.6))
  (pcarrowi 0.3 -2.2 0.15 -1.3, lc(black%50) mcolor(black%50))
  ,
  xlabel(-4 "-{&infin}" 0 +4 "+{&infin}")
  xtitle("",placement(3))
  ylabel(1.185 "{bf:0}" 1.4742 "{it:F}(x1)" 2.2 "{bf:1}", nogrid)
  yline( 1.185, lp(solid) lc(black) lw(*0.4))
  plotregion(margin(b-1.0)) //plotregion(margin(0))  //贴住底边
  aspect(1)  legend(off)
  text(2.0 1.0 "{it:F}(x)", place(e))
  text(0.7 0.8 "{it:f }(x)", place(e))
  text(1.14 -0.53 "x1", place(e))
  text(0.04 -0.53 "x1", place(e))
  text(1.14 4 "x", place(e)) 
  text(0.4 -1.65 "面积 = {it:F}(x1)", place(w)) ;
#d cr 
*--------------------------------------

几点说明:

  • 图中使用了诸如 {&infin} 的形式来添加特殊字符,详情参见 help graph text 或 PDF 帮助 [G-4] graph text
  • 选项 text(2.0 1.0 "xxx", options) 用于在图形中添加标注文字,详情参见 help added_text_options ([G-3] added_text_options)。
  • 选项 aspect(0.8) 可以将图形的纵横比设定为 0.8:1。

5. 添加带箭头的辅助线

有些时候,添加带箭头的辅助线更容易引导读者读懂图中的信息。例如,我们可以将 图 4 修改成如下更为一般化的风格。

图 5

此时,可以借助 twoway pcarrowi 命令来添加带箭头的辅助线,详情参见 help twoway pcarrowi,或 PDF 帮助 [G-2] twoway pcarrowi

*- U[0,1] --> N(0,1)
*--------------------------------------
* set scheme scientific 
#d ;
global arr "lp(dash) lw(*0.5) lc(gray) mcolor(gray)"; //箭头属性
local x1 =-1.4; local F_x1=normal(`x1')+1.2; 
local x2 = 0.0; local F_x2=normal(`x2')+1.2; 
local x3 = 1.3; local F_x3=normal(`x3')+1.2; 
twoway
  (function y = 1.2 +normal(x), range(-4 +4)   lp(solid) lc(black))
  (function y = 2.0*normalden(x), range(-4 +4) lp(solid))            
  (pcarrowi `F_x1' -4.0 `F_x1' `x1', $arr)
  (pcarrowi `F_x1' `x1'     0  `x1', $arr)
  (pcarrowi `F_x2' -4.0 `F_x2' `x2', $arr)
  (pcarrowi `F_x2' `x2'     0  `x2', $arr) 
  (pcarrowi `F_x3' -4.0 `F_x3' `x3', $arr)
  (pcarrowi `F_x3' `x3' 0 `x3', $arr)   
  ,
  xtitle("", placement(3) margin(t-4))
  xlabel(-4 "-{&infin}" `x1' 0 `x3' 4 "+{&infin}")
  ylabel(1.185 "{bf:0}" 1.28 "0.08" 1.7 "0.50" 
         2.103 "0.90" 2.2 "{bf:1}",nogrid)
  yline( 1.185, lp(solid) lc(black) lw(*0.4))
  plotregion(margin(l-1.68 b-1.28))
  aspect(0.8)  
  legend(off)
  text(2.1  3.5 "{it:F}(x)" , place(e))
  text(0.1  3.5 "{it:f }(x)", place(e))  
  text(1.14 4 "x", place(e)) ;
#d cr 
*--------------------------------------
graph export "function_addline_04.png", width($width) replace 

6. 扩展应用:用 twoway function 绘制正方形

其实,一旦我们可以准确定义水平和垂直附加线,就可以用它来绘制各种图形。例如,正方形是由四条直线构成的:两横两纵,也就是 图 3a图 3b 的组合。

本例中,我们可以借助这个技巧绘制四个正方形,以呈现「方差-偏差」之间的组合关系,这是机器学习和预测问题中常见的权衡问题。

图 6

Stata 代码如下:

*-Variance v.s Bias 方差-偏差组合

clear
set seed 135
set obs 15
input x0  y0
      1   1
      3.2 1
      1   3.2
      3.2 3.2
end 

gen x1 = runiform(0.5, 0.7)
gen y1 = runiform(2.8, 3.0)

gen x2 = runiform(3.2, 4.0)
gen y2 = runiform(3.2, 4.0)

gen x3 = runiform(2.8, 3.6)
gen y3 = runiform(0.6, 1.4)

gen x4 = runiform(0.9, 1.1)
gen y4 = runiform(0.9, 1.1)

#d ;
global dash "lp(solid) lc(gray) lw(*0.6)";
global dot  "mc(black%80) msize(*1)";
twoway 
  (scatter y1 x1, ms(oh) $dot )
  (scatter y2 x2, ms(oh) $dot )
  (scatter y3 x3, ms(oh) $dot )
  (scatter y4 x4, ms(oh) $dot )
  (scatter y0 x0, ms(D) mc(red%80) msize(*0.8))
  
  (function y=0,   range(0 2) $dash) 
  (function y=0,   range(0 2) $dash horizontal)
  (function y=2,   range(0 2) $dash) 
  (function y=2,   range(0 2) $dash horizontal) 
  
  (function y=2.2, range(0 2) $dash) 
  (function y=0,   range(2.2 4.2) $dash horizontal)
  (function y=4.2, range(0 2) $dash) 
  (function y=2,   range(2.2 4.2) $dash horizontal)  

  (function y=0,   range(2.2 4.2) $dash) 
  (function y=2.2, range(0 2) $dash horizontal)
  (function y=2,   range(2.2 4.2) $dash) 
  (function y=4.2, range(0 2) $dash horizontal) 
  
  (function y=2.2, range(2.2 4.2) $dash) 
  (function y=2.2, range(2.2 4.2) $dash horizontal)
  (function y=4.2, range(2.2 4.2) $dash) 
  (function y=4.2, range(2.2 4.2) $dash horizontal)  
  ,
  xlabel(1 "Low Variance" 3.2 "High Variance")  
  ylabel(1 "Low Bias" 3.2 "High Bias", nogrid angle(90))
  yscale(noline ) xscale(noline) 
  aspect(1) 
  legend(off);
#d cr 
graph export "function_addline_06.png", width($width) replace

→ → 本文 dofiles 下载:
连享会 / 实证分析可视化-本文 dofiles-

7. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 绘图 可视化
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh