插播消息:最初建的交流群已经无法使用了,新建群的加入方式见次条推送。
本篇是“基础绘图系统”系列推文的最后一篇,我们来介绍三种不常见的图形,对应的绘图函数分别如下:
stars()
fourfoldplot()
mosaicplot()
stars()
该函数主要用于绘制星形图,具体见下面例子。语法结构如下:
stars(x, full = TRUE, scale = TRUE,
radius = TRUE, labels = dimnames(x)[[1]],
locations = NULL, nrow = NULL, ncol = NULL,
len = 1, key.loc = NULL,
key.labels = dimnames(x)[[2]], key.xpd = TRUE,
xlim = NULL, ylim = NULL, flip.labels = NULL,
draw.segments = FALSE, col.segments = 1:n.seg,
col.stars = NA, col.lines = NA,
axes = FALSE, frame.plot = axes,
main = NULL, sub = NULL,
xlab = "", ylab = "",
cex = 0.8, lwd = 0.25,
lty = par("lty"), xpd = FALSE,
mar = pmin(par("mar"),
1.1+ c(2*axes+ (xlab != ""),
2*axes+ (ylab != ""), 1, 0)),
add = FALSE, plot = TRUE, ...)
基础
参数x
为矩阵或数据框,为了展示该函数的绘制效果,这里使用mtcars
作为输入对象:
par(plt = c(0,1,0,1))
stars(mtcars, ncol = 8)
上图中,一个星形表示一个样本,文本为对应的样本名(即
mtcars
的行名);在每个星形中,一个扇形表示一个变量,扇形的半径表示该样本此变量在全体样本的相对大小;
ncol
参数表示图形排列的列数;nrow
为排列行数。
其他一些基础参数的含义:
full:默认值为TRUE,表示星形包含的所有扇形组成一个圆;FALSE表示组成半圆;
radius:默认值为TRUE,表示扇形半径的线条被绘制出来;FALSE表示不绘制;
scale:默认值为TRUE,表示各变量被分别标准化至0-1之间;FALSE表示假设数据已经被标准化至0-1之间了;
flip.labels:控制星形标签的书写位置是否上下交替,默认值会根据情况进行选择;在本例中标签就进行了上下交替放置,以防止重叠。
修饰
key.loc:图例的位置;
draw.segments:是否对扇形区域进行填充,默认值为FALSE;
col.segments:仅在
draw.segments
为TRUE时生效,对扇形区域进行着色;向量结构,元素个数应与变量个数(即每个星形包含的扇形个数)相同;col.stars:仅在
draw.segments
为FALSE时生效,对星形整体的内部进行着色;向量结构,元素个数应与样本个数(即星形个数)相同;col.lines:仅在
draw.segments
为FALSE时生效,对星形整体的外轮廓进行着色;向量结构,元素个数应与样本个数(即星形个数)相同。
下面例子通过key.loc
参数增加了图例,通过col.segments
参数区分各变量:
par(plt = c(0,1,0,1))
stars(mtcars, ncol = 9, key.loc = c(16,1),
draw.segments = TRUE,
col.segments = rainbow(11, s = 0.6, v = 0.75))
fourfoldplot()
该函数绘制的图形可称为四瓣图。语法结构如下:
fourfoldplot(x, color = c("#99CCFF", "#6699CC"),
conf.level = 0.95,
std = c("margins", "ind.max", "all.max"),
margin = c(1, 2), space = 0.2,
main = NULL,
mfrow = NULL, mfcol = NULL)
参数
x
为2*2*k列联表;数组结构。
我们使用以下例子来说明四瓣图的含义。
首先生成列联表:
x <- aperm(UCBAdmissions, c(2, 1, 3))
dimnames(x)[[2]] <- c("Yes", "No")
names(dimnames(x)) <- c("Sex", "Admit", "Department")
ftable(x)
## Department A B C D E F
## Sex Admit?
## Male Yes 512 353 120 138 53 22
## No 313 207 205 279 138 351
## Female Yes 89 17 202 131 94 24
## No 19 8 391 244 299 317
aperm
函数的功能是调整数组的元素顺序,如上面的代码aperm(UCBAdmissions, c(2, 1, 3))
表示将该数组的第1、2个元素位置互换;
ftable
函数的功能是将列联表转换成更“短平”(flat)的样式,以便于展示;每个大写字母对应加州大学伯克利分校的一个系。
上面的列联表x
的大小为2*2*5,将各系的数据合并,可得到一个2*2的列联表x
:
x1 <- margin.table(x, c(1, 2))
x1
## Admit
## Sex Yes No
## Male 1198 1493
## Female 557 1278
Sex
表示性别,Admit
表示是否被该系录取;数字表示对应情景下的频数;
margin.table
函数的功能是计算列联表的边缘频数。
以上述数据为例,四瓣图可以用来判别录取是否与性别相互独立。先以2*2的x1
为例:
fourfoldplot(x1)
图中,每个象限代表一个2*2列联表对应位置的频数;
每个象限包含3个四分之一圆,其中中间圆的半径表示列联表此位置的数学期望,其余两个表示置信区间的两个端点;默认为95%置信区间,由
conf.level
参数控制;当相邻象限的置信区间存在交叉时,则认为零假设成立(即列联表对应的两个事件相互独立);由于上图中不交叉,因此不能否认该系录取与性别相互之间不独立。
下列例子中的列联表的尺寸为2*2*k,其中k = 6:
fourfoldplot(x, mfrow = c(2,3))
每个四瓣图对应一个系(即大写字母)。
mosaicplot()
该函数用于绘制马赛克图。它有两种语法结构,如下:
mosaicplot(x, main = deparse(substitute(x)),
sub = NULL, xlab = NULL, ylab = NULL,
sort = NULL, off = NULL, dir = NULL,
color = NULL, shade = FALSE,
margin = NULL, cex.axis = 0.66,
las = par("las"), border = NULL,
type = c("pearson", "deviance", "FT"), ...)
mosaicplot(formula, data = NULL, ...,
main = deparse(substitute(data)),
subset,
na.action = stats::na.omit)
同fourfoldplot
函数一样,该函数的输入对象x
也是列联表,但对其大小没有要求。
先以上面已经使用过的x
为例:
mosaicplot(x, main = "UCBAdmissions")
每个矩形块的面积与对应位置的频数成正比。
数据集Titanic
的大小为4*2*2*2:
ftable(Titanic)
## Survived No Yes
## Class Sex Age
## 1st Male Child 0 5
## Adult 118 57
## Female Child 0 1
## Adult 4 140
## 2nd Male Child 0 11
## Adult 154 14
## Female Child 0 13
## Adult 13 80
## 3rd Male Child 35 13
## Adult 387 75
## Female Child 17 14
## Adult 89 76
## Crew Male Child 0 0
## Adult 670 192
## Female Child 0 0
## Adult 3 20
绘制效果如下:
par(plt = c(0.08,1,0.08,1))
mosaicplot(Titanic, shade = TRUE)
参数
shade
可以为矩形块上色,颜色与残差相关,具体见上图右侧图例。