clValid多图布局与图例提取问题及ggplot2绘图咨询
clValid聚类验证可视化问题及解决方案
问题背景
以下是使用mouse数据,通过clValid函数计算内部(Internal)和稳定性(Stability)聚类验证分数的示例代码:
data(mouse) express = mouse[,c("M1","M2","M3","NC1","NC2","NC3")] rownames(express) = mouse$ID intern = clValid(express, 2:6, clMethods=c("hierarchical","kmeans","pam"), validation="internal") stab = clValid(express, 2:6, clMethods=c("hierarchical", "kmeans", "pam"), validation="stability")
可视化需求
需要创建一个2行5列的图形布局:
- 第一行:Internal - Dunn | Internal - Silhouette | Stability - APN | Stability - AD | 图例
- 第二行:内部图下方标注“数值越高越好” | 稳定性图下方标注“数值越低越好”(第二行仅两个标注,对应第一行前两组图的下方)
当前存在的问题
- 布局未生效,实际输出为1行5列,不符合预期的2行5列结构;
- 无法从
clValid的基础绘图对象中提取独立图例。
咨询问题
- 是否可以使用ggplot2绘制clValid对象?
- 能否提取非ggplot2绘图对象的图例?
解决方案与解答
一、修复布局问题
clValid默认使用R基础绘图系统,要实现指定布局,需用layout()手动定义布局矩阵,再逐个绘制子图、图例和标注:
# 定义2行5列的布局:第二行前两列分别对应内部/稳定性图的标注,后三列留空 layout_matrix <- matrix(c(1,2,3,4,5, 6,6,7,7,NA), nrow=2, byrow=TRUE) layout(layout_matrix) # 绘制第一行的4个验证图,关闭默认图例 plot(intern, measure="Dunn", main="Internal - Dunn", legend=FALSE) plot(intern, measure="Silhouette", main="Internal - Silhouette", legend=FALSE) plot(stab, measure="APN", main="Stability - APN", legend=FALSE) plot(stab, measure="AD", main="Stability - AD", legend=FALSE) # 绘制独立图例 plot(intern, measure="Dunn", main="", axes=FALSE, frame.plot=FALSE, legend.only=TRUE) # 绘制第二行的标注(去除边距,仅显示文本) par(mar=c(0,0,0,0)) plot.new() text(0.5, 0.5, "数值越高越好", cex=1.2) plot.new() text(0.5, 0.5, "数值越低越好", cex=1.2)
二、用ggplot2绘制clValid对象
clValid没有内置ggplot2绘图方法,但可以提取对象中的验证数据,手动用ggplot2构建可视化:
library(ggplot2) library(tidyr) # 提取内部验证数据并转换为长格式 intern_data <- as.data.frame(intern@measures) intern_data$k <- 2:6 intern_long <- pivot_longer(intern_data, cols = c(Dunn, Silhouette), names_to = "Metric", values_to = "Score") # 绘制内部验证ggplot图 ggplot(intern_long, aes(x = k, y = Score, color = Method)) + geom_line(linewidth = 1) + geom_point(size = 2) + facet_wrap(~Metric, scales = "free_y") + labs(title = "Internal Validation Metrics") + theme_bw() # 提取稳定性验证数据并转换为长格式 stab_data <- as.data.frame(stab@measures) stab_data$k <- 2:6 stab_long <- pivot_longer(stab_data, cols = c(APN, AD), names_to = "Metric", values_to = "Score") # 绘制稳定性验证ggplot图 ggplot(stab_long, aes(x = k, y = Score, color = Method)) + geom_line(linewidth = 1) + geom_point(size = 2) + facet_wrap(~Metric, scales = "free_y") + labs(title = "Stability Validation Metrics") + theme_bw()
如果需要组合成需求的布局,可以用patchwork包拼接ggplot对象和文本标注。
三、提取非ggplot2绘图对象的图例
基础绘图系统的图例无法直接提取为独立对象,但有两种可行方案:
- 调用
plot(clValid_obj, legend.only=TRUE)单独绘制图例,放入布局的指定位置(如上述布局代码所示); - 将基础绘图转换为ggplot2对象(参考上述方法),再用
cowplot::get_legend()提取独立图例。
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

