核心命令:twoway scatter
绘制散点图最基本、最核心的命令是 twoway scatter,其基本语法结构为:

twoway scatter yvar xvar [if] [in] [, options]
yvar: Y轴(纵轴)的变量名。xvar: X轴(横轴)的变量名。[if] [in]: 可选的语句,用于选择特定的观测值。options: 可选的选项,用于美化图形。
基础示例
我们使用 Stata 自带的 auto 数据集进行演示,请确保数据集已加载:
sysuse auto, clear
示例 1:最基本的散点图
绘制汽车价格 (price) 与每加仑英里数 (mpg) 的关系。
twoway scatter price mpg
这会生成一个最基本的散点图,X轴是 mpg,Y轴是 price。
常用选项
通过添加选项,我们可以极大地美化图形。

标题和轴标签
")`: 添加图形主标题。
subtitle("副标题"): 添加副标题。note("脚注"): 在图形底部添加脚注。caption("图注"): 在图形标题下方添加图注。"X轴标签")设置X轴的标签。"Y轴标签"): 设置Y轴的标签。legend(...): 控制图例,legend(off)可以关闭图例。
twoway scatter price mpg, ///"汽车价格与燃油效率关系") ///"每加仑英里数") ///"价格 (美元)") ///
note("数据来源:1978年汽车数据")
提示: 在 Stata 命令窗口中,输入 可以将一行命令换行,使代码更清晰易读。
标记点 的外观
msymbol(symbol_type): 设置标记点的形状。- 常用值:
Oh(空心圆),Th(空心三角),Sh(空心方块),Dh(菱形), ,x,p(五角星) 等。
- 常用值:
mcolor(color): 设置标记点的颜色。msize(size): 设置标记点的大小。mfcolor(color): 设置标记点填充色。mlcolor(color): 设置标记点轮廓颜色。
twoway scatter price mpg, msymbol(Th) mcolor(red) msize(medlarge)
拟合线
这是散点图最常用的功能之一。
lfit: 线性拟合,绘制一条普通最小二乘法回归线。qfit: 二次拟合,绘制一条二次回归曲线。lowess: 局部加权回归散点平滑,绘制一条平滑曲线。
// 带线性回归线的散点图 twoway scatter price mpg || lfit price mpg, ///"带线性回归线的散点图") ///"每加仑英里数") ///"价格 (美元)")
提示: 是 Stata
twoway图形中的“图形叠加”符号,允许你在一张图上绘制多个图形元素。
// 带LOWESS平滑曲线的散点图 twoway scatter price mpg || lowess price mpg, ///"带LOWESS平滑曲线的散点图") ///"每加仑英里数") ///"价格 (美元)")
其他常用选项
scheme(scheme_name): 设置图形的整体风格。scheme(s1mono)使用黑白单色主题。graphregion(color(white)): 将图形背景设置为白色。plotregion(margin(zero)): 去掉图形周围的边距。
高级应用
按组分类绘制
如果想在一张图上为不同组别绘制散点图,可以使用 by() 选项,但这会生成多个子图,如果想在同一个坐标系中绘制,则可以为不同组指定不同的 scatter 命令。
使用 by() 生成分面图
假设我们想按 foreign(是否为进口车)分组,分别绘制 price 和 mpg 的关系。
// foreign有两个值:0(国产) 和 1(进口)
scatter price mpg, by(foreign, title("国产 vs 进口车"))
在同一图上绘制多组散点图
使用 叠加,并利用 if 条件语句。
twoway (scatter price mpg if foreign == 0, mcolor(blue) msymbol(Oh)) ///
(scatter price mpg if foreign == 1, mcolor(red) msymbol(Th)), ///
title("国产车与进口车价格对比") ///
xtitle("每加仑英里数") ///
ytitle("价格 (美元)") ///
legend(label(1 "国产车") label(2 "进口车"))
提示: 为每个
scatter命令加上括号 是一个好习惯,尤其是在叠加多个图形元素时,可以避免歧义。
添加标签
有时我们想在散点上标注特定点的信息,比如汽车的品牌 (make)。
mlabel(varname): 使用varname的值作为标记点的标签。mlabel(...)必须与msymbol(i)(即不显示标记点) 或msymbol(....)结合使用,否则标签会覆盖在点上,看不清楚。
// 找出价格最高的5辆车
sort price in 1/5
// 为这5辆车添加标签
twoway scatter price mpg if price >= r(max), ///
mlabel(make) mlabsize(small) mlabangle(45) ///"价格最高的5款汽车") ///"每加仑英里数") ///"价格 (美元)")
注意:
r(max)是一个返回值,表示变量price的最大值,这里if price >= r(max)是一个简化的写法,实际中应先计算最大值,然后用in或if精准选择,上面的例子直接用in 1/5来选择价格最高的5辆车更直接。
添加参考线
yline(#): 在Y轴值为 的位置添加一条水平参考线。xline(#): 在X轴值为 的位置添加一条垂直参考线。
twoway scatter price mpg || lfit price mpg, ///
yline(10000, lpattern(dash) lcolor(gray)) ///
xline(20, lpattern(dash) lcolor(gray)) ///"添加参考线") ///"每加仑英里数") ///"价格 (美元)")
保存图形
绘制好图形后,通常需要将其导出为图片文件。
// 在绘制图形之前,先定义保存的格式和路径 graph export "my_scatterplot.png", width(1000) replace // 或者,在绘制图形后,使用 "Graph Editor" 窗口手动保存 // 右键点击图形 -> "Save Graph as..." -> 选择格式 (PNG, PDF, EPS, TIFF等)
width(1000): 设置图片的宽度(像素)。replace: 如果文件已存在,则覆盖它。- 常用格式:
png,pdf,eps,tif。
完整代码示例
这是一个综合了多种选项的完整例子,展示了如何创建一个信息丰富、外观专业的散点图。
// 1. 加载数据
sysuse auto, clear
// 2. 绘制复杂的散点图
twoway ///
// 第一层:国产车数据,蓝色空心圆
(scatter price mpg if foreign == 0, mcolor(blue) msymbol(Oh) msize(medlarge)) ///
///
// 第二层:进口车数据,红色实心三角
(scatter price mpg if foreign == 1, mcolor(red) msymbol(T) msize(medlarge)) ///
///
// 第三层:为所有数据点添加线性回归线
(lfit price mpg, lcolor(black) lpattern(solid)) ///
///
// 第四层:为进口车数据添加LOWESS平滑曲线
(lowess price mpg if foreign == 1, lcolor(red) lpattern(dash)) ///
///
// 设置图形全局选项
, ///"汽车价格与燃油效率分析", size(large)) ///
subtitle("按国产/进口车分类", size(small)) ///"每加仑英里数 (MPG)", margin(medsmall)) ///"价格 (美元)", margin(medsmall)) ///
legend( ///
order(1 "国产车" 2 "进口车" 3 "总体回归线" 4 "进口车平滑线") ///
cols(2) position(6) ring(0) ///
) ///
note("注:虚线为LOWESS平滑曲线,实线为线性回归线。", size(vsmall)) ///
scheme(s1color) ///
graphregion(color(white))
// 3. 保存图形
graph export "auto_price_analysis.png", width(1200) replace
- 核心命令:
twoway scatter yvar xvar - 美化工具:
title(),xtitle(),ytitle(),legend() - 标记点控制:
msymbol(),mcolor(),msize() - 拟合线:
|| lfit yvar xvar或|| qfit/lowess ... - 多组比较: 使用 和
if条件语句 -
mlabel(varname) - 保存:
graph export "filename.png", ...
掌握这些基本操作后,你就可以根据需要组合使用各种选项,创建出满足研究需求的精美散点图了。
