Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者: 连玉君 (中山大学)
邮箱: arlionn@163.com
本文 dofiles 下载:
连享会 / 实证分析可视化 → -本文 dofiles-
绘制图形时,经常需要添加一些辅助线来提高可图形的可读性 (参见 Stata绘图:在图片中添加虚线网格线 )。例如,我们像绘制如下图形 (代码附后):
这里的灰色辅助虚线应该如何添加呢?
显然,问题的关键是:我们要能够控制辅助虚线的 位置 和 长短。
大家首先想到的可能是 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
输出结果为:
这显然不符合我们的要求:能确定位置,但无法控制长短。因为 Stata 默认辅助线会贯穿横轴或纵轴变量的取值范围,即占满绘图区。详情可以参阅帮助文件:help graph yline
或 help 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
Stata 的 twoway function
命令可以绘制函数图,借助它我们可以精准地定义辅助虚线的位置和长短。先看两个简单的例子。
例 1: 定义一条水平辅助线。位置:
*-水平辅助线
twoway function y=3, ///
range(0.5 3) xlabel(0(1)4) ylabel(0(1)4)
输出效果:
例 2: 定义一条垂直辅助线。位置:
*-垂直辅助线
twoway function y=3, horizontal ///
range(0.5 3) xlabel(0(1)4) ylabel(0(1)4)
输出效果:
有些读者可能会想,能否用 twoway function x=3
来定义上图中的垂直辅助线呢?答案是:这种方式可以绘制一条贯穿整个绘图区的竖线,但无法限定其取值范围。
命令 twoway function y=3, horizontal
的巧妙之处在于,通过附加 horizontal
选项来实现垂直辅助线的绘制,但由于函数形式本身还是 function y=3
,我们仍然可以通过 range(0.5 3)
来限定
事实上,我们可以换个角度理解这问题。附加 horizontal
选项后,纵轴变成的了 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
下面这幅图呈现了标准正态分布的密度函数
你能找出图中是如何应用本文中的绘图技巧的吗?
*--------------------------------------
* 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。
有些时候,添加带箭头的辅助线更容易引导读者读懂图中的信息。例如,我们可以将 图 4 修改成如下更为一般化的风格。
此时,可以借助 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
其实,一旦我们可以准确定义水平和垂直附加线,就可以用它来绘制各种图形。例如,正方形是由四条直线构成的:两横两纵,也就是 图 3a 和 图 3b 的组合。
本例中,我们可以借助这个技巧绘制四个正方形,以呈现「方差-偏差」之间的组合关系,这是机器学习和预测问题中常见的权衡问题。
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-
Note:产生如下推文列表的 Stata 命令为:
lianxh 绘图 可视化
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh