You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 布局未生效,实际输出为1行5列,不符合预期的2行5列结构;
  2. 无法从clValid的基础绘图对象中提取独立图例。

咨询问题

  1. 是否可以使用ggplot2绘制clValid对象?
  2. 能否提取非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绘图对象的图例

基础绘图系统的图例无法直接提取为独立对象,但有两种可行方案:

  1. 调用plot(clValid_obj, legend.only=TRUE)单独绘制图例,放入布局的指定位置(如上述布局代码所示);
  2. 将基础绘图转换为ggplot2对象(参考上述方法),再用cowplot::get_legend()提取独立图例。

内容的提问来源于stack exchange,提问作者vic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:53:24