要想用ggplot2重绘mfuzz.plot2
结果,就要理解图形中每个部分的含义。封面就是我ggplot2绘图结果,聚类折线+图例,如果你看不全封面记得给公众号加个星标⭐。
其实使用ggplot2重现该图并非必需,只是我不会给图例和折线图拼图,基础绘图能力比较差,再就是为了增强自己对图形的理解,因此才自己ggplot2重绘了下。
原mfuzz.plot2
结果如下:
x轴每个时间点为有序的时间节点,y轴为标准化后的表达矩阵,即standardise()结果。
颜色该基因在该聚类中的隶属度,聚类图形轮廓由外到内颜色变化,表示隶属度由低到高。其中当mfuzz.plot2()
中center
为TRUE
时,轮廓中心为单条线为黑色。
隶属度为0-1的值,生成一个0-1之间,与颜色向量colo
长度等长的向量colorseq
。利用隶属度与等长向量的匹配关系,给每个基因在该Cluster分配颜色。也就是说,同一个基因在不同的Cluster中的隶属度不同,其颜色也可能不同。
通过给Cluster中基因表达量折线分配颜色的方式可知,这些颜色其实是一系列离散的配色,但是其细分的足够多,所以可以通过mfuzzColorBar
生成连续配色的图例。ggplot2绘图时,生成连续配色图例并与折线图拼图,是我ggplot2重现该图时的最大难点。
基础参数
mfuzz_class
为standardise()
标准化表达矩阵结果.
mfuzz_cluster
为 mfuzz()
fuzzy c-means 算法结果。通过调用R包e1071::cmeans
进行计算。
x11
设为FALSE。
eset = mfuzz_class
cl = mfuzz_cluster
mfrow = c(2, 5)
colo = "fancy"
min.mem = 0
time.labels = colnames(exp_mean)
#time.points
ylim.set = c(0, 0)
xlab = "Time"; ylab = "Expression changes"
x11 = F
ax.col = "black"; bg = "white"; col.axis = "black";
col.lab = "black"; col.main = "black"; col.sub = "black";
col = "black"; centre = FALSE; centre.col = "black"; centre.lwd = 2;
Xwidth = 5; Xheight = 5; single = FALSE
复现mfuzz.plot2绘图
原函数是循环绘图,为了拆解重现,我们只绘制Cluster1
部分。
思路已经说清,下面注释也挺详细的,自己看下吧。
# 开始梳理
## 基础数据
clusterindex <- cl[[3]] # 各基因所属cluter
memship <- cl[[4]] # 各基因所属cluter的隶属度
memship[memship < min.mem] <- -1 # 将小于最低隶属度的隶属度强制改为-1
colorindex <- integer(dim(exprs(eset))[[1]]) # 行数长度的0向量
## 配色
if (colo == "fancy") {
fancy.blue <- c(c(255:0), rep(0, length(c(255:0))),
rep(0, length(c(255:150))))
fancy.green <- c(c(0:255), c(255:0), rep(0, length(c(255:150))))
fancy.red <- c(c(0:255), rep(255, length(c(255:0))),
c(255:150))
colo <- rgb(b = fancy.blue/255, g = fancy.green/255,
r = fancy.red/255) # 取出颜色
}
length(colo) # 618
# 根据隶属度范围0-1,生成与颜色向量等长的数值向量
colorseq <- seq(0, 1, length = length(colo)) # 取出与颜色一致长度的值
# 只取出Cluster1的部分绘制
tmp <- exprs(eset)[clusterindex == j, , drop = FALSE] # 时序输入文件,标准后的表达矩阵
tmpmem <- memship[clusterindex == j, j] # 取出cluster j中的membership
# 坐标轴数值
ymin <- min(tmp) # 定义最值
ymax <- max(tmp)
xlim.tmp <- c(1, dim(exprs(eset))[[2]]) # 列数
ylim <- c(ymin, ymax)
# 基础绘图布局
par(mfrow = mfrow, bg = bg, col.axis = col.axis, # 绘制布局
col.lab = col.lab, col.main = col.main, col.sub = col.sub,
col = col)
# 绘制坐标轴标签和标题
plot.default(x = NA, xlim = xlim.tmp, ylim = ylim, # 绘制坐标轴标签和标题
xlab = xlab, ylab = ylab, main = paste("Cluster",
j), axes = FALSE )
# 绘制坐标轴
axis(1, 1:dim(exprs(eset))[[2]], time.labels, # 绘制坐标轴
col = ax.col)
axis(2, col = ax.col)
# 根据membership数值给基因配色,即大致相同的隶属度,在各Cluter中绘图基本是相似的。
for (jj in 1:(length(colorseq) - 1) ) {
tmpcol <- (tmpmem >= colorseq[jj] & tmpmem <=
colorseq[jj + 1]) # 通过membership给予颜色
if (sum(tmpcol) > 0) {
tmpind <- which(tmpcol)
for (k in 1:length(tmpind)) {
# if (missing(time.points)) {
lines(tmp[tmpind[k], ], col = colo[jj]) # 划线数据为tmp,标准化后的表达量值。
# }
# else lines(time.points, tmp[tmpind[k], ],
# col = colo[jj])
}
}
}