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

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

New！ `lianxh` 命令发布了：

`. ssc install lianxh`

`. help lianxh`

⛳ Stata 系列推文：

## 2. 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)
width(\$width) replace
``````

``````#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
width(\$width) replace
``````

## 3. 使用 twoway function 命令

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

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

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

``````#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. 例子：正态分布的密度函数图和分布图

``````*--------------------------------------
* 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. 添加带箭头的辅助线

``````*- 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
*--------------------------------------
``````

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

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
``````

→ → 本文 dofiles 下载：

## 7. 相关推文

Note：产生如下推文列表的 Stata 命令为：
`lianxh 绘图 可视化`

`ssc install lianxh, replace`

## 相关课程

### 最新课程-直播课

• Note: 部分课程的资料，PPT 等可以前往 连享会-直播课 主页查看，下载。

### 关于我们

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

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

New！ `lianxh` 命令发布了：

`. ssc install lianxh`

`. help lianxh`