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