普林斯顿Stata教程之Stata做图


作者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云)


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个子命令及绘图类型,其中最重要的是scatterline。我们将对scatterline着重介绍,并简要介绍其他绘图类型。

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)
制定Y轴 隐藏图例

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") )

在这里,我使用了三个选项:titlesubtitlelegendlegend选项有许多子选项; 此处用order列出关键点(即12)及其标签,说明第一条线代表白人,第二条线代表黑人。要省略关键点,只需将其从列表中移除即可。其他的图例选项,请参阅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()选项可以让你使用已命名的不同风格,比如foregroundgridyxline,或是根据线1~15使用样式命名的p1-p15,详情请参阅help linestyle。如果您想根据方案选择合适样式元素,这非常有用。

您也可以指定样式的三个成分从而确定风格:线条样式,宽度和颜色:

  • 线条样式由clpattern()选项指定。最常见的模式是soliddashdot, 查看help linepatternstyle获取更多信息。
  • 线宽由clwidth()指定,可用的选项包括thinmediumthick,详情参见help linewidthstyle
  • 颜色由clcolor()指定,使用颜色名称(如redwhiteblue)或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。该命令有两个选项replaceasis,如果该文件已存在,则需要使用replace选项替代原有图形,而asis选项会冻结图形(包括其当前风格),然后将其保存。默认情况下,将图形保存为可在未来可编辑的实时格式。以Stata格式保存图形后,可以使用graph use filename命令从磁盘加载它。(graph savegraph use类似于saveuse)存储在内存中的任何图形可以使用graph display [name]显示。help graph_manipulation了解更多信息。

如果您打算将图表合并到另一个文档中,您可能需要将其保存为更便携的格式。Stata的命令graph export filename可以使用各种矢量或光栅格式导出图形,通常由文件扩展名指定。您还可以使用graph print打印图形,或使用Windows剪贴板将其复制并粘贴到文档中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容