1.简介
核密度图常用来反映连续变量数值的密度分布,在论文中核密度图通常以多期(年份)来进行表示,表现变量随时间发展的动态变化过程。因此本文主要以多期核密度为例,利用R语言中的DescTools包与ggplot2包两种方法进行多期核密度图的绘制。如需本文数据可在后台回复【20220101】获得,具体绘图code可参考本文。以下为本文绘制图形展示:
2.演示数据
以国家统计局[1]官方网站上关于2017-2020年我国31个省份人均GDP(未包含港澳台数据)为例,利用核密度图来展示我国31个省份人均GDP的密度分布。以下为数据格式,数据以“density.csv”命名,在绘图的过程中首先对数据进行对数化处理,采用对数化之后的数据进行图形绘制。数据可在国家统计局官网自行下载,也可后台回复【20220101】获得。
3.前期数据处理
3.1安装相关包与加载包
#安装package
#install.packages(reshape2)
#install.packages(DescTools)
#install.packages(RColorBrewer)
#install.packages(ggplot2)
#install.packages(ggthemes)
#加载package
library(reshape2)
library(DescTools)
library(RColorBrewer)
library(ggplot2)
library(ggthemes)
3.2加载数据与查看数据
setwd("C:/Users/Acer/Desktop") #设置路径
data <- read.csv("C:/Users/Acer/Desktop/density.csv", header = TRUE)#加载数据
head(data)#查看数据
# province y2020 y2019 y2018 y2017
#1 北京市 164889 164563 153095 137596
#2 天津市 101614 90058 85757 79837
#3 河北省 48564 46182 43108 40883
3.3将宽数据转换为长数据
mydata <- melt(data, #待转换的数据集名称
id.vars=c("province"), #要保留的主字段
variable.name="year",#转换后的分类字段名称(维度)
value.name="Per.GDP")#转换后的度量值名称
head(mydata) #查看转换后的数据
# province year Per.GDP
#1 北京市 y2020 164889
#2 天津市 y2020 101614
#3 河北省 y2020 48564
3.4 将年份变量转换为因子变量,并指定因子水平顺序。
levels(factor(mydata$year))
# [1] "y2020" "y2019" "y2018" "y2017"
#将year转换成因子型,同时对标签进行修改
mydata$year <- factor(mydata$year, #选定year列
levels = c("y2020", "y2019", "y2018", "y2017"), #因子水平
labels = c("2020", "2019", "2018", "2017"))#因子标签
3.5 对Per.GDP变量取对数
#对变量Per.GPD进行取对数,并在数据集中生成新的一列,取名为lnPer.GPD
mydata$lnPer.GPD <- log(mydata$Per.GDP)
4.利用DescTools绘制多期核密度
4.1 基础图形
PlotMultiDens(data = mydata, mydata$lnPer.GPD ~ mydata$year)
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220803_ebcbd6d4-1313-11ed-b5a2-fa163eb4f6be.png)
4.2 对图形的线条类型、填充颜色及坐标轴名称进行调整
# 不含有填充色
PlotMultiDens(data = mydata, mydata$lnPer.GPD ~ mydata$year, #设置数据及变量
col = c('blue', 'red', 'green', "black"), #对颜色进行调整
lty = c(1, 2, 4, 5),lwd=2,#设置线段类型及线段的宽度
xlab="lnPer.GPD",ylab="Density", main = "lnPer.GPD核密度曲线图")#设置轴标题
# 含有填充色
PlotMultiDens(data = mydata, mydata$lnPer.GPD ~ mydata$year, #设置数据及变量
col = c('blue', 'red', 'green', "black"), #对颜色进行调整
lty = c(1, 2, 4, 5),lwd=2,#设置线段类型及线段的宽度
fill = SetAlpha(col= c('blue', 'red', 'green', "black"), alpha = 0.1),#设置填充色
xlab="lnPer.GPD",ylab="Density", main = "lnPer.GPD核密度曲线图")#设置轴标题
下面分别为无填充色与有填充色
4.3 也可以利用RColorBrewer包对颜色进行调整。关于RColorBrewer包的使用,可参考R语言绘图|如何调用RColorBrewer包对图形颜色进行修改
PlotMultiDens(data = mydata, mydata$lnPer.GPD ~ mydata$year, #设置数据及变量
col = brewer.pal(4,"Set1"), #对颜色进行调整
lty = c(1, 2, 4, 5),lwd=2,#设置线段类型
fill = SetAlpha(col = brewer.pal(4,"Set1"), alpha = 0.3), #设置填充色
xlab="lnPer.GPD",ylab="Density",main = "lnPer.GPD核密度曲线图") #设置轴标题
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220803_ec059b12-1313-11ed-b5a2-fa163eb4f6be.png)
5.利用ggplot2绘制多期核密度
ggplot2包中绘制多期核密度的图层函数为geom_density()。首先以单期核密度为例进行展示,因为多期核密度建立在单期的基础上,学会如何调整单期核密度的图形,也就能很好地掌握如何对多期核密度图形进行调整。
5.1 单期:基础绘图函数及图形如下图:
ggplot(mydata, aes(x = lnPer.GPD)) +
geom_density()
5.2 对线条的颜色、类型、填充色、主题等进一步调整。调整后的图形如下图:
ggplot(mydata, aes(x = lnPer.GPD)) + #设置x轴为Per.GDP
geom_density(linetype = 2, color = "black", fill = "lightblue", alpha = 0.8, size =1.2) + #对线的类型、大小、颜色、填充等进行设置
labs(x = "lnPer.GDP", y = "density", title = "lnPer.GDP核密度曲线图") + #设置轴标题
theme(plot.title = element_text(hjust = 0.5)) + #对标题的位置进行调整
theme_stata() #设置绘图主题
基础图形(左图)与修饰后的图形(右图)
5.3 多期核密度图(含有填充色)
ggplot(mydata, aes(x = lnPer.GPD, color = year, fill = year, linetype = year)) + #设置数据及映射,根据year进行分组
geom_density(size = 1.1, alpha = 0.1) + #设置线的大小及透明度
theme_stata() + #设置绘图主题
scale_color_brewer(palette = "Dark2") + #利用RColorBrewer中的颜色对颜色进行设置
scale_fill_brewer(palette = "Dark2") + #利用RColorBrewer中的颜色对填充色进行设置
labs(x = "lnPer.GPD", y = "density", title = "lnPer.GPD核密度曲线图", caption = "数据来源:国家统计局") + #设置主标题及轴标题等
theme(plot.title = element_text(hjust = 0.5), #设置标题位置
legend.position = c(0.85,0.7)) #设置图例位置
5.4 多期核密度图(去掉填充色)
ggplot(mydata, aes(x = lnPer.GPD, color = year, linetype = year)) +
geom_density(size = 1.1, alpha = 0.1) +
theme_stata() +
scale_color_brewer(palette = "Dark2") +
labs(x = "lnPer.GPD", y = "density", title = "lnPer.GPD核密度曲线图", caption = "数据来源:国家统计局") +
theme(plot.title = element_text(hjust = 0.5),
legend.position = c(0.85,0.7))
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20220803_ec529a48-1313-11ed-b5a2-fa163eb4f6be.png)
6. 其他
此外,也可以对使用ggplot2绘制的核密度图进行分面操作,具体图层语法可参考R语言绘图|箱线图(多变量、分组、分面),与箱线图进行分面类似。同时,核密度图在也可以在Stata中绘制,下期将更新如何利用Stata进行多期核密度图的绘制。
如有帮助请多多点赞哦!
参考资料
国家统计局: https://data.stats.gov.cn/index.htm