Star (Spider/Radar) plot

Star plot introduction

在数据可视化中,如果数据是三维或者不多于六维的话,那么星图就是反映数据分布得最佳图像。R的基础包里面提供了绘制星图的函数—stars()函数。
每一个星图都是由五个角构成,用线段离中心的长度来表示变量值的大小,用于展示多个变量的个体,每个变量的图形相互独立,即每个角都有一条轴线与中心点连接起来这五条轴线,它们分别对应了数据的维度,数值越大,轴线越长,画出来的星图也就越大,因此说如果数据维度不超过六维的适合用星图来分析。由于星图整幅图形看起来像星星一样,因此称之为星图。

require(grDevices)
?stars  # get help information

Star plot

Star plot输入数据是一个多维数据矩阵或数据框,每一行数据将生产一个星图.

# 设置图像面板的大小,也可以设置字体大小。解决变量名字太长重合的问题。
win.graph(width=10.5, height=9.5,pointsize=9)  

stars(iris, 
      full=T, # 显示每个星图的全部
      scale = T, # 将数据标准化到区间[0,1]
      radius=T, # 显示星图内部的小线段
      labels = as.character(iris[, 5]), # 显示每一个变量, 需要将它转为character类型. 默认为数据的行名
      flip.labels=FALSE, # 变量名和星图之间不相互重叠
      key.loc = c(25, 1.5), # 比例尺的坐标位置
#     key.labels, # 比例尺的标签,默认为变量的名称
      len = 0.8, # 半径和线段的缩放倍数
      
# set color      
      draw.segments = TRUE, # 做线段图,即每个变量以一个扇形表示
      col.segments = rainbow(8), # 每个块的颜色设置。需要在draw.segments为TRUE时,此参数才有效
#     col.stars = 1:10, # 设置某个(些)特定星图的颜色。需要在draw.segments为TRUE时,此参数才有效
#     col.lines=c(1:150), #每个线条的颜色设置。需要在draw.segments为FALSE时,此参数才有效
      main="star plot", # plot title
      frame.plot = TRUE # 给整个图形画一个边框
      )

require(grDevices)

# 设置图像面板的大小,也可以设置字体大小。解决变量名字太长重合的问题。
win.graph(width=10.5, height=9.5,pointsize=9)  

stars(iris, 
      full=T, # 显示每个星图的全部
      scale = T, # 将数据标准化到区间[0,1]
      radius=T, # 显示星图内部的小线段
      labels = as.character(iris[, 5]), # 显示每一个变量, 需要将它转为character类型. 默认为数据的行名
      flip.labels=FALSE, # 变量名和星图之间不相互重叠
      key.loc = c(25, 1.5), # 比例尺的坐标位置
#     key.labels, # 比例尺的标签,默认为变量的名称
      len = 0.8, # 半径和线段的缩放倍数
      
# set color      
      draw.segments = FALSE, # 做线段图,即每个变量以一个扇形表示
#     col.segments = rainbow(8), # 每个块的颜色设置。需要在draw.segments为TRUE时,此参数才有效
#     col.stars = 1:10, # 设置某个(些)特定星图的颜色。需要在draw.segments为TRUE时,此参数才有效
      col.lines=c(1:150), #每个线条的颜色设置。需要在draw.segments为FALSE时,此参数才有效
      main="star plot", # plot title
      frame.plot = TRUE # 给整个图形画一个边框
      )

star plot with legend

# Create data
M <- matrix(runif(60),6,10)
colnames(M) <- letters[1:10]
M
##              a         b         c         d          e         f
## [1,] 0.1690561 0.2436283 0.8237891 0.5898221 0.11779629 0.1965646
## [2,] 0.7740475 0.1518807 0.9037255 0.7728421 0.04472236 0.8732011
## [3,] 0.1364404 0.4757446 0.9384920 0.5310429 0.25110463 0.5245112
## [4,] 0.5624083 0.3375503 0.8618360 0.3622199 0.39196564 0.7470456
## [5,] 0.3435879 0.9840702 0.7793431 0.3425977 0.60793201 0.7175924
## [6,] 0.5327409 0.4623063 0.9133537 0.2104020 0.65872531 0.9886933
##              g         h         i          j
## [1,] 0.3675136 0.4122593 0.4090872 0.99969555
## [2,] 0.5779456 0.9319320 0.7028081 0.86476549
## [3,] 0.0622692 0.6565686 0.9279656 0.91085199
## [4,] 0.3016736 0.9314663 0.7211456 0.65037812
## [5,] 0.5066183 0.4203821 0.8384323 0.15699981
## [6,] 0.8185248 0.4402832 0.1371943 0.07534302
# star plot, the position of each sub-plot are returned
star_plot <- stars(M, len=0.6, lwd=2, col.lines=1:10)
#star_plot

# applies a function to each plot to add star
Map(
  function(x,y) stars(
                  matrix(1,ncol=10,nrow=6), key.loc=c(x,y),
                  key.labels=colnames(M), add=TRUE, lty=3, cex=0.7, len=0.6
                ),
  star_plot$Var1, star_plot$Var2
)

Spider or Radar plot

location参数以一个两列的矩形给出每个星图的位置,默认放在一个规则的矩形网络上,若提供给参数一个长度为2的向量,那么所有星图都将被放在该坐标上,从而形成一个蜘蛛网或雷达图。

stars(iris, 
      full=T, # 显示每个星图的全部
      scale = T, # 将数据标准化到区间[0,1]
      radius=T, # 显示星图内部的小线段
      locations = c(0, 0),
      flip.labels=FALSE, # 变量名和星图之间不相互重叠
      key.loc = c(0, 0), # 比例尺的坐标位置
#     key.labels, # 比例尺的标签,默认为变量的名称
     #len = 0.8, # 半径和线段的缩放倍数
      lty = 1, 
      draw.segments = FALSE, # 做线段图,即每个变量以一个扇形表示
      col.lines=c(1:150), #每个线条的颜色设置。需要在draw.segments为FALSE时,此参数才有效
      main="Spider or Radar plot", # plot title
      frame.plot = TRUE # 给整个图形画一个边框
      )

ggplot2 Radar plot

此方法通过ggplot2的一款扩展主题包——ggradar来绘制出简单漂亮的雷达图。

#install.packages("ggradar") #还不能通过此方法安装
#devtools::install_github("ricardo-bion/ggradar", dependencies=TRUE)

#加载相关扩展包
library(ggradar)  
library(dplyr)
library(scales)

#利用dplyr管道操作符重组绘图对象
mtcars %>%
  rownames_to_column(var = "group" ) %>%
  mutate_each(funs(rescale), -group) %>%
  tail(4) %>%  select(1:10) -> mtcars_radar

#ggradar函数绘制雷达图
ggradar(mtcars_radar)

one problem for star plot

I actually don’t know the reason (I will update this when I know the answer)

PA <- c(125, 98, 59,89,60,90,102,113,66,80,96,92,81,59,86,80,78,53,83)
PB <- c(80, 63,47,81,74,60,65,95,83,78,63,57,98,75,71,75,107,95,83)
PC <- c(24,23,80,84,90,60,68,47,75,57,56,59,68,65,59,74,51,63,69)
PD <- c(57,108,107,54,81,68,75,35,81,68,96,83,54,68,69,84,71,69,36)
d <- data.frame(PA,PB,PC,PD)

stars(d, 
      full=T, # 显示每个星图的全部
      scale = T, # 将数据标准化到区间[0,1]
      radius=T, # 显示星图内部的小线段
      labels = row.names(d), # 显示每一个变量, 需要将它转为character类型. 默认为数据的行名
      flip.labels=FALSE, # 变量名和星图之间不相互重叠
      key.loc = c(25, 1.5), # 比例尺的坐标位置
#     key.labels, # 比例尺的标签,默认为变量的名称
      len = 0.8, # 半径和线段的缩放倍数
      
# set color      
      draw.segments = TRUE, # 做线段图,即每个变量以一个扇形表示
      col.segments = rainbow(8), # 每个块的颜色设置。需要在draw.segments为TRUE时,此参数才有效
#     col.stars = 1:10, # 设置某个(些)特定星图的颜色。需要在draw.segments为TRUE时,此参数才有效
#     col.lines=c(1:150), #每个线条的颜色设置。需要在draw.segments为FALSE时,此参数才有效
      main="star plot", # plot title
      frame.plot = TRUE # 给整个图形画一个边框
      )

问题在于:比如最后一个图形,有两个扇形应该面积相等,且最小的那个扇形虽然面积小,但不应该缺失。

Reference

数据可视化之星图
stars plot formatting: keys on the graphs
Radar plot

CHENYUAN

CHENYUAN
Pursuing the dream and the best future

CHENYUAN Blog Homepage

因为不想遗忘! 在这个信息大爆炸的年代,最重要的是对知识的消化-吸收-重铸。每天学了很多东西,但是理解的多少,以及能够运用多少是日后成功的关键。作为一个PhD,大脑中充斥了太多的东西,同时随着年龄的增长,难免会忘掉很多事情。所以只是为了在众多教程中写一个自己用到的,与自己...… Continue reading