Stata:使用 joyplot 绘制峰峦图

最近在 Github 上看到了一个很有意思的 Stata 命令,可以用于绘制峰峦图:https://github.com/asjadnaqvi/stata-joyplot

今天就让我们来一起学习下这个命令的使用方法,最后我们再使用这个命令绘制一幅峰峦图展示中国各省市新冠肺炎每日新增确诊病例数量的变化:

安装

虽然这个命令提供了从 ssc 上安装的方法,但是 ssc 上的版本有 bug,附件中提供了这个命令的最新安装包,使用 net install 即可安装:

net install joyplot.pkg, from("joyplot.pkg 所在的文件夹路径")

另外这个命令的使用还需要下面这两个命令的支持:

* 安装
ssc install palettes, replace
ssc install colrspace, replace

使用

作者在主页提供了一些示例,我们来一起看一下这些示例。

首先加载 OWID_data.dta 数据,里面是全球各国的新冠数据:

use OWID_data.dta, clear

保留欧盟国家、保留需要的变量以及把日期格式化为年月日格式:

* 保留欧盟国家
keep if group10 == 1
keep country date new_cases
format date %tdCY-N-D

然后就可以使用 joyplot 绘图了,joyplot 命令的完整使用介绍可以参考帮助文档:help joyplot。

例如绘图展示 2021 年 7 月 4 日以来各国新增确诊人数:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country)

使用黑色线条、白色填充、完全不透明:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) lc(black) color(white) alpha(100)

使用白色线条、黑色填充,50% 的透明度,线宽 0.05:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) lc(white) color(black) alpha(50) lw(0.05)

使用线条而非面积图:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) lines lw(0.2)

使用黑色线条:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) lines lw(0.2) color(black)

把 y 轴的标签放到右边:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) lines lw(0.2) ylabpos(right)

使用 xsize 和 ysize 设置图表的长宽:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) lw(0.2) ylabpos(right) xsize(5) ysize(7)

颠倒 y 轴变量的排序:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) yrev

也颠倒 x 轴变量的排序 & 偏移 y 轴标签的坐标:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) yrev xrev offset(20)

全局标准化:每个个体的值都处以整体的最大值,不加该选项的时候是分别除以各自的最大值:

joyplot new_cases date if date > mdy(7, 4, 2021), over(country) normg

sparkline 命令

其实这个命令有些类似 sparkline 命令,不过 sparkline 命令不允许图表重叠:

use OWID_data.dta, clear
keep if group10 == 1
keep country date new_cases
format date %tdCY-N-D

* 标准化:每个个体的值都除以自己的最大值
levelsof country, local(country)
foreach i in `country' {
sum new_cases if country == "`i'"
replace new_cases = new_cases / r(max) if country == "`i'"
}
replace country = subinstr(country, " ", "_", .)
spread country new_cases
keep if date > mdy(7, 4, 2021)
sum date
* di string(22738, "%tdCY-N-D")
* di mdy(4, 3, 2022)
* di date("2022-4-3", "YMD")

另外 sparkline 不能同时绘制过多变量:

* 另外 sparkline 不能同时绘制过多变量:
sparkline Austria - Malta date, xla(`=mdy(7, 4, 2021)'(39)`=mdy(4, 3, 2022)', format(%tdCY-N-D)) ysc(off axis(2))

使用 joyplot 绘制国内各省新冠肺炎新增确诊人数的变化

之前我们分享过国内各省的新冠疫情数据:中国各省市新冠疫情数据 & 世界各国各地区新冠疫情数据(更新至 2022 年 4 月 20 日),我们可以使用里面的数据来绘图展示国内各省的新增数量变化。

use 中国各省新冠疫情数据.dta, clear
encode prov, gen(province)
xtset province date
gen new_cases = confirmed - L.confirmed
drop if date == mdy(4, 21, 2022)
replace new_cases = 0 if new_cases < 0

joyplot new_cases date, over(prov) ///
xticks(`=mdy(1, 21, 2020)'(39)`=mdy(4, 20, 2022)') ///
color(tableau) title("新冠肺炎每日新增确诊人数各省份发展趋势") ///
subtitle("绘制:微信公众号 RStata") ///
note("数据来源:https://www.tianditu.gov.cn/coronavirusmap/", size(*0.8))

点击这里跳转到 RStata 短书平台获取附件:Stata:使用 joyplot 绘制峰峦图

评论