G6.设置图形的纵横比例

作者: 连玉君 (中山大学)
邮箱:

Note: 生成文中图形的 Stata 代码统一放在了文末。

提要

绘制 Stata 图形时,可以使用 aspect(#) 设置整幅图的纵横比,也可以同时设置主体图形 (坐标轴内部区域) 的绝对尺寸 (单位为英寸),以实现对主体图形纵横比的控制。例如,下面的命令将保证图形的主体部分和整幅图形的纵横比均为 1:1。

sysuse "auto.dta", clear
scatter mpg weight, xsize(4) ysize(4) aspect(1)

1. 简介

在 Stata 中,默认情况下生成的图形通常是「扁平形」的:

sysuse "auto.dta", clear
scatter mpg weight

fig01_ratio_default

图 1:Stata 默认图形的纵横比

有时候我们需要调整图形的纵横比,以便得到「方形」或者「窄版」的图形。例如: - 论文为双栏排版时,插入「方形」图形更合适 (见图 2); - 将两幅图并列显示时,子图采用窄版样式更合适 (见图 3); - 绘制函数图,如圆形或三角形时,使用「方形」图形可以避免失真 (见图 4)。

fig02_ratio_square

图 2:纵横比为 1:1 的图形

fig03_ratio_combine_two

图 3:两幅并排放置的图形

fig04_ratio_circle

图 4:函数图 - 圆圈和三角形

2. 方形图形的绘制方法

那么,如何调整图形的纵横比呢?我们先看看生成图 2 代码:

sysuse "auto.dta", clear
scatter mpg weight, xsize(4) ysize(4) aspect(1)

可以看出,我们设定了选项 xsize(4) ysize(4) aspect(1) 来调整图形的纵横比。解释如下: - xsize(4) ysize(4):将图形整体 (图形区域,graph region) 的高度设为 4 英寸,宽度也设定为 4 英寸。 - aspect(1) 将绘图区域 (plot region) 的纵横比设定为 1:1,即正方形。

对于中文读者而言,很难区分 graphplot 的差别。不过,你可以根据如下规则来区分它们:若以横纵坐标轴为分界,则坐标轴内围的部分为「绘图区,plot region」;坐标轴外围的部分为「图形区 (graph region)」。

因此,调整图形纵横比的「经验法则」如下: - 如果你只需保证整幅图 (包括散点、坐标轴、标题、图例和留白等) 的纵横比为 1:1,那就只需要将 xsize()ysize() 设定为相同的尺寸即可。 - 如果你只需要保证图形主体部分 (坐标轴内围部分) 的纵横比为 1:1,那就只需将设定 aspect(1) 即可。不过,此时坐标轴外围可能会出现很多空白区域,因为图形整体的纵横比并未改变。

在绘制图 2 时,我采用了双管齐下的方法,即 xsize(4) ysize(4) aspect(1)。大家可以尝试设定为 xsize(4) ysize(3) aspect(1),图形的整体效果或许会更协调一些。



下面的内容是为了大家更好地理解 Stata 图形的布局,以及 xsize(4) ysize(3) aspect(1) 选项的作用原理,有兴趣的读者可以继续。

3. 进阶解释

3.1 绘图区 (plot region) 与图形区 (graph region)

如果把 Stata 的图形视为一个画布,为了实现对图形的精细调整,这个画布被细分为四个区域。如 图 5 所示,从内到外,这四个区域分别由四个方框划分: - [1] + [2] 号区域称为「绘图区」(plot region) - [1] 号区域称为「内绘图区」,用于呈现散点、折线等图形元素 - [2] 号区域称为「外绘图区」,是 [1] 号区域与坐标轴之间的留白 (margin) - [3] + [4] 号区域称为「图形区」(graph region) - [3] 号区域称为「内图形区」,用于呈现图形的标题、注释、图例等文本或标注信息。 - [4] 号区域称为「外图形区」,是 [3] 号区域与图形外边界之间的留白 (margin)

简言之,若以横纵坐标轴为分界,则坐标轴内围的部分为「绘图区,plot region」,坐标轴外围的部分为「图形区 (graph region)」。

Stata_region_option_01

图 5:Stata 图形的区域划分 (graph region v.s plot region)

Source: [G-3] region options (help region_option)

多数 Stata 用户都不曾意识到 [2] 号和 [4] 号留白区域的存在,因为,在多数绘图模板中,[2] 号区与 [1] 号区都选择相同的底色,[3] 号和 [4] 号区的底色通常也都相同。

为了让大家清晰地在实际图形中分辨出上述四个区域的差别,我绘制了一幅配色「很丑」的图形,呈现于 图 6。其中,灰色区域为「plot region」,黄色部分为「graph region」,两个区域内的深色部分表示「留白 (margin)」。

graph_region_margin

图 6:Stata 图形的区域划分示例

大家可以对照如下代码查看每个区域的区分方法:

// 图 6
sysuse "auto.dta", clear
drop if mpg>38
scatter mpg weight, ///
    xsize(3) ysize(3) aspect(1)      ///
    plotregion( ifcolor(black*0.2))  ///  
    plotregion(  fcolor(black*0.4))  ///          
    graphregion(ifcolor(yellow*0.2)) ///
    graphregion( fcolor(yellow*0.5))   

有兴趣的读者可以参阅 Stata 手册 [G-3] region options (或执行命令 help region_option)。我们可以根据需要调整各种「留白」(margin) 的大小和间距。

3.2 aspect() 和 xsize()+ysize() 的区别

aspect()xsize()+ysize() 的主要差别在于二者作用的范围不同。由上述分析可知,Stata 的图形区域被分为两个部分:

  • plot region:这是显示数据的区域,包括坐标轴和数据点。调整 aspect() 就是调整这个区域的纵横比。
    • 默认情况下,Stata 会根据数据范围和坐标轴刻度自动决定纵横比,但通常都小于 1。因此,设定 aspect(1) 会将纵横比调整为 1:1,从而绘制一个正方形的数据区域;而设定 aspect(2) 会使得图形的高度是宽度的两倍。
  • grap hregion:这是包含整个图形的区域,包括标题、坐标轴标签、图例等。调整 xsize()ysize() 是对 graph region 的实际尺寸 (单位为英寸) 进行调整。

4. 小结

在 Stata 中,默认的图形纵横比通常较为”扁平”。当需要绘制特定纵横比的图形时(如正方形或圆形),可以使用 aspect() 选项来调整 plotregion 的纵横比。同时,如果想精确控制图形的物理尺寸并避免空白区域,可以结合使用 xsize()ysize() 来调整图形的整体布局。

通过理解 plot regiongraph region 的区别,结合使用这些选项,我们可以灵活地调整图形的纵横比,同时确保图形美观、紧凑。

大家可以自行琢磨一下本文图 3 和图 3 中是如何调整纵横比的。

5. 附:文中使用的代码

*-Basic setting - 绘图模板
  ssc install scientific, replace
  set scheme  scientific
*-安装外部命令,其中包含 shapes 命令
  ssc install graphfunctions, replace  

// Figure 1

sysuse "auto.dta", clear
scatter mpg weight

graph export "fig01_ratio_default.png", width(700) replace


// Figure 2

scatter mpg weight, xsize(4) ysize(4) aspect(1)

graph export "fig02_ratio_square.png", width(400) replace 


// Figure 3

local size "xsize(2) ysize(2) aspect(1)"
scatter mpg weight if foreign==0, `size' subtitle("Domestic")
graph save temp01.gph, replace 
scatter mpg weight if foreign==1, `size' subtitle("Foreign")
graph save temp02.gph, replace 

graph combine temp01.gph temp02.gph, ///
      xsize(7) ysize(3) ///
      xcommon ycommon 

graph export "fig03_ratio_combine_two.png", width(700) replace 


// Figure 4

shape circle, n(3)   rotate(90) replace   // Triangle
shape circle, n(300) genx(x_c ) geny(y_c) // Circle

twoway (line _y   _x, lcolor(green))  ///
       (line y_c x_c, lcolor(blue)),  ///
        xlabel(-15 15) ylabel(-15 15) ///
        legend(off)                   ///
        xsize(1) ysize(1) aspect(1)  

graph export "fig04_ratio_circle.png", width(400) replace


// Figure 5

sysuse "auto.dta", clear
drop if mpg>38
scatter mpg weight, ///
    xsize(3) ysize(3) aspect(1)      ///
    plotregion( ifcolor(black*0.2))  ///  
    plotregion(  fcolor(black*0.4))  ///          
    graphregion(ifcolor(yellow*0.2)) ///
    graphregion( fcolor(yellow*0.5))   
graph export "graph_region_margin.png", width(600) replace   

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh Stata + 绘图
安装最新版 lianxh 命令:
ssc install lianxh, replace