作者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云)
2.1 散点图
2.1.1简单的散点图
2.1.2 拟合线
2.1.3 点标签
2.1.4 标题,图例和说明
2.1.5 轴标尺和标签
2.2 线图
2.2.1 简单的线图
2.2.2 标题和图例
2.2.3 线条样式
2.2.4 标度选项
2.2.5 图形方案
2.3 其他图形
2.3.1条形图
2.3.2 箱线图
2.3.3 核密度估计
2.4 图形管理
Stata拥有出色的图形设备,可通过graph
命令访问,help graph
了解概述。统计中最常见的图表是显示点或线的双坐标轴X-Y图。这可以通过子命令twoway
实现。twoway
命令中又含42个子命令及绘图类型,其中最重要的是scatter
和line
。我们将对scatter
和line
着重介绍,并简要介绍其他绘图类型。
Stata 10引入了一个图形编辑器,可用于交互式地修改图形。然而,我不会提倡这种做法,因为它与记录和确保研究中所有步骤可重复的目标相冲突。
本节中的所有图表(除非另有说明)都使用带蓝色标题和白色背景的自定义方案,我将在第2.2.5节对方案进行讨论。
2.1 散点图
在本节中,我将使用前文使用过的有关生育率下降的effort
数据集进行图表说明。读取数据:
infile str14 country setting effort change using http://data.princeton.edu/wws509/datasets/effort.raw, clear
为了激起你的兴趣,先展示我们将在本节中完成的作品:
2.1.1简单的散点图
可以使用以下命令生成生育率变化(change)与社会环境(setting)关系的简单散点图:
graph twoway scatter change setting
请注意,首先指定的变量是在Y轴。如果变量有定义标签,则坐标轴显示变量标签名,若无定义则显示变量名。如果这是唯一的图,该命令可以缩写为twoway scatter
,或者scatter
。现在我们将添加一些东西。
2.1.2 拟合线
假设我们也想显示拟合的回归线。在某些软件包中,您需要运行回归,计算拟合线,然后对其进行绘制。Stata可以使用lfit
绘图类型一步完成所有操作(还有一个二次拟合绘图类型qfit
)。通过将每个子图封闭在括号内,可以将它与散点图结合使用(也可以使用两条竖线来分隔它们)。
graph twoway (scatter setting effort) (lfit setting effort)
现在假设我们想在回归线上放置置信区间。Stata可以通过lfitci
来实现这一点,该绘图类型将置信区域绘制为灰色带。(还有一个qfitci
类型用于二次拟合的频带。)因为置信带会遮蔽一些点,所以我们先绘制该区域再绘制点
graph twoway (lfitci setting effort) (scatter setting effort)
请注意,该命令不会标记y轴,而是使用图例。您可以使用该ytitle()
选项为y轴指定标签,并隐藏图例legend(off)
:
graph twoway (lfitci setting effort) (scatter setting effort) , ytitle("Fertility Decline") legend(off)
2.1.3 点标签
有很多选项可以让你控制点的标签,包括它们的形状和颜色,参见help marker_options
。使用mlabel(varname)
选项也可以用变量的值标记点。在下一步中,我们将国名添加到图中:
graph twoway (lfitci change setting)
(scatter change setting, mlabel(country) )
标签中的一个小问题是哥斯达黎加和特立尼达多巴哥(以及巴拿马和尼加拉瓜)相互重叠。我们可以使用12小时时钟指定标签相对于标记的位置来解决这个问题(12是上面的,3是右边,6是下面,9是在标记的左边)。
我们创建一个变量,将默认设置的位置保持为3点,然后将哥斯达黎加移动到9点,特立尼达多巴哥移动到11点以上的位置(我们也可以将尼加拉瓜和巴拿马上移位,到2点方向):
gen pos=3
replace pos = 11 if country == "TrinidadTobago"
replace pos = 9 if country == "CostaRica"
replace pos = 2 if country == "Panama" | country == "Nicaragua"
生成此版本图形的命令如下
graph twoway (lfitci change setting) (scatter change setting, mlabel(country) mlabv(pos) )
2.1.4 标题,图例和说明
有些选项适用于所有双向图形,包括标题,标签和图例等。Stata图表的title()
和subtitle()
通常在顶部,legend()
,note()
和caption()
通常在底部,更多信息键入help title_options
。通常你只需了解标题即可。Stata 11允许图形中的文本包括粗体,斜体,希腊字母,数学符号和字体选择。Stata 14引入了Unicode,大大扩展了可以完成的工作。help graph text
以了解更多信息。
我们对图表的最后调整是添加一个图例来指定线性拟合和95%置信区间。我们使用order(2 "linear fit" 1 "95% CI")
命令,图例的选项按照该顺序标记第二个和第一个项目。我们还使用ring(0)
将图例移动到绘图区域内,并使用pos(5)
将图例框放置在5点钟位置附近。完整命令就是:
graph twoway (lfitci change setting)
(scatter change setting, mlabel(country) mlabv(pos) )
, title("Fertility Decline by Social Setting")
ytitle("Fertility Decline")
legend(ring(0) pos(5) order(2 "linear fit" 1 "95% CI"))
graph export fig31.png, width(500) replace
(file fig31.png written in PNG format)
结果就是本节开始处显示的图形
2.1.5 轴标尺和标签
有一些选项可以控制轴的缩放比例和范围,包括xscale()
和yscale()
。可以是算术,对数值等。更多信息help axis_scale_options
。其它选项控制主要和次要记号和标签,如xlabel()
,xtick()
and mtick()
,同样地,对于y轴,见help axis_label_options
。通常默认值是可以接受的,但还是很高兴您知道它们是可以更改的。
2.2 线图
将使用美国预期寿命数据来说明线图,这试数据Stata附带的数据集之一(试试sysuse dir
看看还有什么可用的)。
sysuse uslifeexp ,clear
(U.S. life expectancy, 1900-1999)
我们的目标是绘制20世纪美国白人和黑人男性的预期寿命。为了激发你的兴趣,将先向你展示最终成果,然后我们将一点一点地构建图表。
2.2.1 简单的线图
最简单的图形所有参数使用默认值:
graph twoway line le_wmale le_bmale year
如果这就是我们所要的图形,可以将命令缩写为twoway line
,或者line
(只适用于散点图和线图)。
线图允许我们指定多个“y”变量,顺序为y1,y2,...,ym,x。本例中,我们指定了两个——对应于白人男性和黑人男性的预期寿命。或者,我们可以使用两条线图:(line le_wmale year) (line le_bmale year)
。
2.2.2 标题和图例
默认图形很好,但图例似乎太罗嗦。我们会将大部分信息转移到标题中,并且只保留肤色信息:
graph twoway line le_wmale le_bmale year , title("U.S. Life Expectancy") subtitle("Males") legend( order(1 "white" 2 "black") )
在这里,我使用了三个选项:title
,subtitle
和legend
。legend
选项有许多子选项; 此处用order
列出关键点(即1和2)及其标签,说明第一条线代表白人,第二条线代表黑人。要省略关键点,只需将其从列表中移除即可。其他的图例选项,请参阅help legend_option
。
下面我希望在画图区域内移动图例来改善空间,比如说在5点钟左右的位置有空余空间。如前所述,我们可以通过使用ring(0)
将图例移动到绘图区域内,并通过pos(5)
将其置于5点钟位置附近。因为这些都是图例子选项,所以都在legend()
命令括号中输入:
graph twoway line le_wmale le_bmale year , title("U.S. Life Expectancy") subtitle("Males") legend( order(1 "white" 2 "black") ring(0) pos(5) )
2.2.3 线条样式
我不知道你感觉如何,但我自己很难区分图画中的默认线条。Stata中有不同的方式控制线条样式。clstyle()
选项可以让你使用已命名的不同风格,比如foreground
,grid
,yxline
,或是根据线1~15使用样式命名的p1-p15
,详情请参阅help linestyle
。如果您想根据方案选择合适样式元素,这非常有用。
您也可以指定样式的三个成分从而确定风格:线条样式,宽度和颜色:
- 线条样式由
clpattern()
选项指定。最常见的模式是solid
,dash
和dot
, 查看help linepatternstyle
获取更多信息。 - 线宽由
clwidth()
指定,可用的选项包括thin
,medium
和thick
,详情参见help linewidthstyle
。 - 颜色由
clcolor()
指定,使用颜色名称(如red
,white
和blue
)或RGB值确定颜色,请参阅help colorstyle
。
我们将白人指定为蓝色,黑人指定为红色:
graph twoway (line le_wmale le_bmale year , clcolor(blue red) ) , title("U.S. Life Expectancy") subtitle("Males")
legend( order(1 "white" 2 "black") ring(0) pos(5))
请注意,这clcolor()
是线图的一个选项,所以我将括号放在line
命令的周围并把clcolor()
插入那里。
2.2.4 标度选项
由上图我们可以看出,预期寿命的提升速度在20世纪下半叶有所减缓。使用对数刻度可以更直观的理解,需要注意的是对数刻度中直线表示恒定的改善幅度。这由help axis_options
可以很容易完成。尤其是yscale()
,它可以让你选择算数(arithmetic
),对数(log
)或倒置刻度(reversed
)。其中倒置刻度是指y轴是从最大的值开始的,最小值反而在最上方。还有一个子选项range()
可以控制绘图范围。在这里,我将y范围指定为25到80,以便将曲线稍微向上移动:
. graph twoway (line le_wmale le_bmale year , clcolor(blue red) ) , title("U.S. Life Expectancy") subtitle("Males") legend(
> order(1 "white" 2 "black") ring(0) pos(5)) yscale(log range(25 80))
2.2.5 图形方案
Stata使用方案来控制图的外观,参见help scheme
。您可以设置默认方案并在所有图形中应用set scheme_name
。您也可以使用不同的方案对所作的最后一个图形重新展示,选出效果最好的方案graph display, scheme(scheme_name)
。
使用graph query, schemes
查看可用方案类型列表。s2color
方案适用于屏幕图表,s1manual
是Stata手册中的风格。economist
是经济学人杂志使用的风格。我们可以获得本节开头所示的图形使用的是economist
风格。
graph display, scheme(economist)
graph export fig32.png, width(500) replace
2.3 其他图形
2.3.1条形图
条形图可用于绘制分类变量的频数分布,或绘制由分类变量定义的组内连续变量的描述性统计。我们将使用Stata附带的城市温度数据集为例说明。
如果我只是键入graph bar, over(region)
我将获得区域变量的频数分布。让我们来展示一月和七月的平均气温的区域分布。要做到这一点,我可以指定(mean) tempjan (mean) tempjuly
,但由于默认统计是平均值,我们可以简写如下。我认为默认图例太长,所以也指定了一个自定义图例。
我使用over()
这样所以区域出现在同一个图表中;·by()
则相反,每个区域都会产生一个单独的坐标轴。bargap()
选项则控制同一个组中不同统计的小节之间的间隔; 在这里我放了一个小空间。gap()
(此处未使用)选项控制不同组别的空间。我还将颜色填充强度设置为70%,我认为这看起来更好。
sysuse citytemp, clear
graph bar tempjan tempjul, over(region) bargap(10) intensity(70)
title(Mean Temperature) legend(order(1 "January" 2 "July"))
. graph export bar.png, width(500) replace
(file bar.png written in PNG format)
显然,1月份东北部和北部中部地区比南部和西部冷得多。七月份的变化较少,但南部的气温较高。
2.3.2 箱线图
使用箱线图可以快速获得变量分布的特征,箱线图是取值范围为1~3分位数的箱子,将中位数用横线显示,并且在盒子上下方增加了“wiskers”,定义为距离中值不超过四分位数间距的1.5倍的最高和最低值。在wiskers上下方的点用圆圈表示为异常值。
让我们画一个地区1月份的温度箱形图。我将使用over(region)
选项,并用sort(1)
选项控制排列顺序——按照第一个变量tempjan
中位数大小排列。我还通过设定RGB值将颜色设置为蓝色:
. graph box tempjan, over(region, sort(1)) box(1, color("51 102 204"))
> title(Box Plots of January Temperature by Region)
.graph export boxplot.png, width(500) replace
(file boxplot.png written in PNG format)
我们看到,1月份的气温在东北部和北部中部地区较低,变化较小,相当一部分城市气温异常偏冷。
2.3.3 核密度估计
对变量分布更详细的展示需要用到平滑直方图,可以使用kdensity
命令使用核密度平滑器计算平滑直方图。
让我们使用默认设置对每个区域的1月温度进行单独的核密度估计,并保存结果。
. forvalues i=1/4 {
2. capture drop x`i' d`i'
3. kdensity tempjan if region== `i', generate(x`i' d`i')
4. }
. gen zero = 0
接下来我们做出核密度估计图。由于密度图重叠,我使用Stata 15中引入的不透明选项使它们透明度达到50%。在这种情况下,我使用颜色名称后面跟着一个%符号和不透明度。我也简化了图例,匹配密度的顺序,并把它放在图示的右上角。
. twoway rarea d1 zero x1, color("blue%50") ///
> || rarea d2 zero x2, color("purple%50") ///
> || rarea d3 zero x3, color("orange%50") ///
> || rarea d4 zero x4, color("red%50") ///
> title(January Temperatures by Region) ///
> ytitle("Smoothed density") ///
> legend(ring(0) pos(2) col(1) order(2 "NC" 1 "NE" 3 "S" 4 "W"))
. graph export kernel.png, width(500) replace
(file kernel.png written in PNG format)
这个图示使我们清楚地看到了1月份气温的区域差异,东北部和北部中心地区的气候分布更冷,更窄,南部和西部的气候相当相似。
2.4 图形管理
Stata默认在内存中保存您绘制的最后一个图形,并将其称为“Graph”。如果你在在创建图形时使用name()
为图形单独命名,在内存中可以保留多个图形。这对于组合图形很有用,help graph combine
了解更多。请注意,即使您保存了数据,保存在内存中的图表也会在您退出Stata时消失,除非您保存图形本身。
要使用Stata自己的格式将当前图形保存到磁盘上,输入graph save filename
。该命令有两个选项replace
和asis
,如果该文件已存在,则需要使用replace
选项替代原有图形,而asis
选项会冻结图形(包括其当前风格),然后将其保存。默认情况下,将图形保存为可在未来可编辑的实时格式。以Stata格式保存图形后,可以使用graph use filename
命令从磁盘加载它。(graph save
和graph use
类似于save
和use
)存储在内存中的任何图形可以使用graph display [name]
显示。help graph_manipulation
了解更多信息。
如果您打算将图表合并到另一个文档中,您可能需要将其保存为更便携的格式。Stata的命令graph export filename
可以使用各种矢量或光栅格式导出图形,通常由文件扩展名指定。您还可以使用graph print
打印图形,或使用Windows剪贴板将其复制并粘贴到文档中。