用R语言绘制雷达图,尝试了三种工具:fmsb、echarts4r和ggradar,前两种绘制的是多边形雷达图,但导出比较麻烦。ggradar默认绘制的是圆形雷达图,这里用分组的方法重新绘制了图形边界,最终成果如下:
1. 安装
# ggradar为github包,需要devtools辅助安装
install.packages('devtools')
library(devtools)
install_github("ricardo-bion/ggradar")
2.获取数据
依然以官网给的mtcars数据为例,用自己的数据需保证数据框除第一列外,其余列数据类型均为数值型:
# 载入ggradar及辅助包(ggradar基于ggplot2作图,后面几个包用于数据处理)
library(ggradar)
library(ggplot2)
library(dplyr)
library(scales)
library(tibble)
options(stringsAsFactors = F)
# 提取mtcars第6列至第10列数据为作图数据,第1列为样本名
mtcars_radar <- mtcars %>%
as_tibble(rownames = "group") %>%
mutate_at(vars(-group), rescale) %>%
tail(1) %>%
select(1,6:10)
# str()函数查看数据框数据类型,除第一列为str外,其他列均为num,符合要求
str(mtcars_radar)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 6 variables:
$ group: chr "Volvo 142E"
$ drat : num 0.622
$ wt : num 0.324
$ qsec : num 0.488
$ vs : num 1
$ am : num 1
3.数据整理
若直接用ggradar作图,为圆形雷达图,如下图所示:
ggradar(mtcars_radar)
这里基于ggplot2分组方法,为数据框增加几行“背景数据”,并在作图时删去原背景,绘制多边形雷达图:
# 原数据框
mtcars_radar
# A tibble: 1 x 6
group drat wt qsec vs am
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Volvo 142E 0.622 0.324 0.488 1 1
# 为数据框增加“背景”数据,绘制三层背景,分别为1.0,0.6,0.3,作为雷达图上、中、下限。
nx <- dim(mtcars_radar)[2]-1
da1 <- matrix(c(rep(1,nx),rep(0.6,nx),rep(0.3,nx)),3,byrow = T)
da2 <- data.frame(group = c('U1','U2','U3'),da1)
colnames(da2) <- colnames(mtcars_radar)
dat2 <- rbind(da2,mtcars_radar)
# 修改后数据框(U1、U2、U3三层背景设置在原数据框之上,按ggplot2绘图原则,原数据框图形会叠在最上层,不受背景线条遮挡,最清晰。
dat2
group drat wt qsec vs am
1 U1 1.0000000 1.0000000 1.0000000 1.0 1.0
2 U2 0.6000000 0.6000000 0.6000000 0.6 0.6
3 U3 0.3000000 0.3000000 0.3000000 0.3 0.3
4 Volvo 142E 0.6221198 0.3239581 0.4880952 1.0 1.0
4.ggradar绘图
# 将dat2数据框除第1列外均转换为数值型数据,保证绘图函数正确执行
dat2[,-1] <- sapply(dat2[,-1],as.numeric)
# 设置dat2第一列数据框为有序因子(factor),保证各分组数据绘制顺序,保证原数据框图形绘制在最上方
dat2$group <- factor(dat2$group,levels = dat2$group)
# 绘制基础图形,调整文字大小,base为所有文字,axis为外圈文字,grid为圈内标签文字
p <- ggradar(dat2, base.size = 12,axis.label.size = 5,grid.label.size = 5,
# 设置各层bar值,values.radar仅支持“内”、“中”,“外”三个数值,超过三个将只取前三
values.radar = c("30%","60%","100%"),
# 设置grid标签环分割值(决定grid标签文字位置),grid.max必须大于数据框最大值,grid.min控制最小环大小,太大图片不协调,grid.mid设置为二者中间值,标签分布较协调
grid.max = 1.0,grid.mid = 0.55,grid.min = 0.1,
# 设置不显示图例
legend.position = 'none',
# 将灰色背景改为白色,原图grid环颜色只保留最小环为灰色且线条类型改为实线,其他全部为白色(不可见)
background.circle.colour = 'white',
gridline.min.colour = 'grey80',
gridline.mid.colour = 'white',
gridline.max.colour = 'white',
gridline.min.linetype = 'solid',
# 设置U1、U2、U3等背景组线条颜色为灰色,与最小环共同构成新背景,需展示的数据组线条颜色为红色
group.colours = c(rep('grey80',3),'red'),
# 设置U1、U2、U3等背景组点大小为0.5、线条宽度为0.5;需展示的数据组点大小为3,线条宽度为1.5(突出展示数据)
group.point.size = c(rep(0.5,dim(dat2)[2]*3),rep(3,dim(dat2)[2])),
group.line.width = c(rep(0.5,dim(dat2)[2]*3),rep(1.5,dim(dat2)[2])),
# 设置图片横向延伸空间,防止外圈文字显示不全
plot.extent.x.sf = 1.2,
# 将数据组样本名称设置为图表标题,并通过ggplot2 theme()函数设置标题位置(居中)和文字大小
plot.title = dat2[4,1])+
theme(plot.title = element_text(hjust = 0.5,size = 16))
完整代码如下:
p <- ggradar(dat2, base.size = 12,axis.label.size = 5,grid.label.size = 5,
values.radar = c("30%","60%","100%"),
grid.max = 1.0,grid.mid = 0.55,grid.min = 0.1,
legend.position = 'none',
background.circle.colour = 'white',
gridline.min.colour = 'grey80',
gridline.mid.colour = 'white',
gridline.max.colour = 'white',
gridline.min.linetype = 'solid',
group.colours = c(rep('grey80',3),'red'),
group.point.size = c(rep(0.5,dim(dat2)[2]*3),rep(3,dim(dat2)[2])),
group.line.width = c(rep(0.5,dim(dat2)[2]*3),rep(1.5,dim(dat2)[2])),
plot.extent.x.sf = 1.2,
plot.title = dat2[4,1])+
theme(plot.title = element_text(hjust = 0.5,size = 16))
# ggsave保存图片
ggsave('E:/radar.png',p,device = 'png',width = 5,height = 5)
5. 不足之处
(1)通过分组设置新背景,替换原有背景,导致图例无法展示,只能展示单组数据,无法展示多组数据;
(2)values.radar参数只能输入3个值作为分层标签,导致新背景分层只能≤3层,无法扩增展示层级数。
6.参考资料
(1)R: ggradar做雷达图:http://www.yixuan520.com/sbtj-0/d39076543.html
(2)R语言可视化——用ggplot构造期待已久的雷达图:https://cloud.tencent.com/developer/article/1092251
(3)fmsb雷达图绘制:
https://zhuanlan.zhihu.com/p/67313787
https://zhuanlan.zhihu.com/p/51869255
https://zhuanlan.zhihu.com/p/47653188
(4)echarts4r雷达图绘制(交互式):https://echarts4r.john-coene.com/articles/chart_types.html#radar
(5)plotly雷达图绘制(交互式):http://vlambda.com/wz_wzwU1n6RVy.html