Stata 绘制柱状图中的位置调整

Stata 绘制柱状图中的位置调整

不少小伙伴问过关于 Stata 绘制柱状图的问题。其实 Stata 绘制柱状图的方法大体就两种:twoway bar 和 graph bar,今天就给大家系统介绍下 Stata 绘制柱状图的方法以及位置调整的应用。

下面的图均是使用 lightrstata 主题绘制,该主题可以使用下面的代码安装:

1
2
3
* 安装和设定绘图主题
net install rstata_scheme.pkg, from("rstata_scheme 文件夹的路径")
set scheme lightrstata, perm

首先我们绘制一幅最简单的柱状图,twoway 版本的:

1
2
3
4
5
6
7
8
9
10
11
12
13
* 基础柱状图
use diamonds.dta, clear
* 这份数据集包含了 53940 颗钻石的价格和其它属性数据:
* carat:钻石的重量(克拉)
* cut:钻石的切工(Fair, Good, Very Good, Premium, Ideal)
* color:钻石的颜色
* clarity:钻石的纯净度
* price:钻石的价格

* 统计 cut 变量的分布
contract cut
tw bar _freq cut, fcolor("102 194 165") barwidth(0.8) ti("使用 twoway bar 绘制的柱状图") subti("绘制:微信公众号 RStata")
gr export pic1.png, replace width(1600)

如果我想给每个 cut 组设置一种颜色怎么办呢?

对于 tw bar 来说,方法就是分 5 个图层绘制柱状图,然后每个图层的柱状图使用一种颜色,颜色可以使用 colorscheme 命令生成,这个命令可以从附件中的 colorscheme 文件夹安装:

1
net install colorscheme.pkg, from("colorscheme 文件夹的路径")

然后就可以绘制填充颜色的柱状图了:

1
2
3
4
5
6
7
8
9
10
11
12
use diamonds, clear
contract cut
colorscheme 5, palette(Accent)
tw ///
bar _freq cut if cut == 1, color("`r(color1)'") barwidth(0.8) || ///
bar _freq cut if cut == 2, color("`r(color2)'") barwidth(0.8) || ///
bar _freq cut if cut == 3, color("`r(color3)'") barwidth(0.8) || ///
bar _freq cut if cut == 4, color("`r(color4)'") barwidth(0.8) || ///
bar _freq cut if cut == 5, color("`r(color5)'") barwidth(0.8) ///
xlab(, val) leg(off) ti("使用 twoway bar 绘制的柱状图") ///
subti("绘制:微信公众号 RStata")
gr export pic2.png, replace width(1600)

不过这种颜色的设置没有什么实际意义的,只是让图看起来更加炫酷。但是有时候我们想知道例如“我们班的男生和女生生源地分布”这种问题的答案, 这个时候使用颜色填充就有意义了,例如下图展示了钻石不同切工的克拉分布:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use diamonds, clear
colorscheme 8, palette(Set2)
gr bar, over(clarity) over(cut) ///
stack asyvars yti(count) ///
leg(ti(clarity)) ///
bar(1, color("`r(color1)'")) ///
bar(2, color("`r(color2)'")) ///
bar(3, color("`r(color3)'")) ///
bar(4, color("`r(color4)'")) ///
bar(5, color("`r(color5)'")) ///
bar(6, color("`r(color6)'")) ///
bar(7, color("`r(color7)'")) ///
bar(8, color("`r(color8)'")) ///
ti("使用 graph bar 绘制的柱状图") ///
subti("绘制:微信公众号 RStata") ///
leg(ti(, size(*0.7) pos(11)))
gr export pic3.png, replace width(1600)

有时候我们会绘制像下面这样的图:

1
2
3
4
5
6
7
sysuse auto, clear
tw ///
hist price if for || ///
hist price if !for, ///
ti("重叠的柱状图") ///
subti("绘制:微信公众号 RStata")
gr export pic4.png, replace width(1600)

这个图的问题就是相互重叠问题很严重,为此我们可以采取下面两种方法解决这个问题,第一种是将位于上层的图层设置为透明的,如下图:

1
2
3
4
5
6
7
tw ///
hist price if for, fc(red) || ///
hist price if !for, fc(green%50) ///
leg(order(1 "进口车" 2 "国产车")) ///
ti("柱状图重叠的解决办法一:设置透明度") ///
subti("绘制:微信公众号 RStata")
gr export pic5.png, replace width(1600)

第二种方法是不再给柱形图填充颜色:

1
2
3
4
5
6
7
tw ///
hist price if for, fc(red) lc(red) || ///
hist price if !for, color(none) lc(green) ///
leg(order(1 "进口车" 2 "国产车")) ///
ti("柱状图重叠的解决办法一:不设置填充色") ///
subti("绘制:微信公众号 RStata")
gr export pic6.png, replace width(1600)

位置调整有三种,用 ggplot2 的话来说,分别是 identity、fill 和 dodge。刚刚上面的图就是 identity 模式。除此之外,fill 模式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use diamonds, clear
gen id = _n
colorscheme 8, palette(Paired)
gr bar (count) id, over(clarity) over(cut) ///
stack asyvars yti(count) ///
leg(ti(clarity)) ///
bar(1, color("`r(color1)'")) ///
bar(2, color("`r(color2)'")) ///
bar(3, color("`r(color3)'")) ///
bar(4, color("`r(color4)'")) ///
bar(5, color("`r(color5)'")) ///
bar(6, color("`r(color6)'")) ///
bar(7, color("`r(color7)'")) ///
bar(8, color("`r(color8)'")) ///
percent ///
ti("graph bar 绘制的柱状图:fill 模式") ///
subti("绘制:微信公众号 RStata") ///
leg(ti(, size(*0.7) pos(11)))
gr export pic7.png, replace width(1600)

fill 模式

最后,dodge 模式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use diamonds, clear
gen id = _n
colorscheme 8, palette(Paired)
gr bar (count) id, over(clarity) over(cut) ///
asyvars yti(count) ///
leg(ti(clarity)) ///
bar(1, color("`r(color1)'")) ///
bar(2, color("`r(color2)'")) ///
bar(3, color("`r(color3)'")) ///
bar(4, color("`r(color4)'")) ///
bar(5, color("`r(color5)'")) ///
bar(6, color("`r(color6)'")) ///
bar(7, color("`r(color7)'")) ///
bar(8, color("`r(color8)'")) ///
ti("graph bar 绘制的柱状图:dodge 模式") ///
subti("绘制:微信公众号 RStata") ///
leg(ti(, size(*0.7) pos(11)))
gr export pic8.png, replace width(1600)

dodge 模式

identity 模式就是开头的 graph bar 绘制的图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use diamonds, clear
colorscheme 8, palette(Set2)
gr bar, over(clarity) over(cut) ///
stack asyvars yti(count) ///
leg(ti(clarity)) ///
bar(1, color("`r(color1)'")) ///
bar(2, color("`r(color2)'")) ///
bar(3, color("`r(color3)'")) ///
bar(4, color("`r(color4)'")) ///
bar(5, color("`r(color5)'")) ///
bar(6, color("`r(color6)'")) ///
bar(7, color("`r(color7)'")) ///
bar(8, color("`r(color8)'")) ///
ti("graph bar 绘制的柱状图:identity 模式") ///
subti("绘制:微信公众号 RStata") ///
leg(ti(, size(*0.7) pos(11)))
gr export pic81.png, replace width(1600)

identity 模式

其它类型的图其实也有位置的调整,不过不如直方图有用,例如散点图增加扰动:

1
2
3
4
5
6
7
use mpg, clear
sc hwy displ, name(p1, replace) ti(没有添加散点扰动)
sc hwy displ, name(p2, replace) jitter(3) ti(添加了散点扰动)
gr combine p1 p2, ///
ti("散点图中的位置调整") ///
subti("绘制:微信公众号 RStata")
gr export pic9.png, replace width(1600)

最后我们再汇总下三种柱状图的模式:

identity fill dodge

该课程为免费课程,点击阅读原文即可从平台上下载推文相关文档和材料。

Stata 绘制柱状图中的位置调整

https://tidyfriday.cn/posts/32261/

作者

Painter

发布于

2021-06-07

更新于

2021-06-23

许可协议

评论