R中如何关联相异度矩阵与元数据绘制带彩色分组点的MDS图
问题背景
- 持有sourmash输出的.csv格式数据矩阵,矩阵样式参考示例:

- 同时持有矩阵对应的元数据,可从多维度对矩阵内样本分组,元数据样式参考示例:

- 需求:绘制MDS(多维尺度分析)图时,根据样本对应的元数据值为散点着色。目前已完成矩阵与元数据导入、矩阵格式转换、MDS坐标计算,但无法将元数据值与矩阵正确关联,实现按元数据分组着色。
原有代码
数据处理代码
#import matrix and metadata sm_matrix <- read.csv("path to .csv", header = TRUE, sep = ",") md <- read.csv("path to .csv", header = TRUE, sep = ",") #transform for plotting sm_matrix <- as.matrix(sm_matrix) #plot mds <- sm_test %>% dist() %>% cmdscale() %>% as_tibble() colnames(mds) <- c("dim.1", "dim.2")
绘图尝试代码
ggscatter(mds, x = "dim.1", y = "dim.2", color = md$Location, palette = "jco", size = 1, ellipse = TRUE, ellipse.type = "convex", repel = TRUE)
运行报错信息
Error in `check_aesthetics()`: ! Aesthetics must be either length 1 or the same as the data (92): colour Run `rlang::last_error()` to see where the error occurred. Warning message: In if (color %in% names(data) & is.null(add.params$color)) add.params$color < - color : the condition has length > 1 and only the first element will be used
报错原因
- 你生成的
mds数据集仅包含MDS两个维度的坐标值,没有和元数据md按样本ID做关联匹配,直接给color参数传外部向量md$Location时,ggscatter会优先从传入的mds数据集内匹配列名,传入外部向量一旦出现mds和md行顺序不一致、样本数不匹配的情况,就会触发长度不匹配错误,警告也是因为传入的是多元素向量,函数仅取第一个元素做判断导致的。 - 原有代码存在笔误:计算MDS时调用的对象是
sm_test,和前面定义的sm_matrix不一致,运行时会先触发对象不存在的报错。 - 计算MDS时没有保留样本ID,哪怕向量长度刚好匹配,也可能出现样本和元数据错位对应的问题。
解决方案
- 先确认矩阵第一列为样本名、元数据内有和矩阵一一对应的样本ID列,修正数据处理逻辑,计算MDS时保留样本ID,再通过样本ID把MDS坐标和元数据合并,保证每一行的坐标和元数据完全对应:
library(tidyverse) library(ggpubr) # 导入矩阵,将第一列样本名设为行名 sm_matrix <- read.csv("path to matrix.csv", header = TRUE, sep = ",") %>% column_to_rownames(var = names(.)[1]) # 导入元数据 md <- read.csv("path to metadata.csv", header = TRUE, sep = ",") # 计算MDS坐标,保留样本ID列 mds <- sm_matrix %>% # 修正原有笔误,替换不存在的sm_test对象 dist() %>% cmdscale() %>% as_tibble(rownames = "sample_id") colnames(mds)[2:3] <- c("dim.1", "dim.2") # 按样本ID合并MDS坐标与元数据 # 注意:如果元数据内样本ID列名不是sample_id,需要修改by参数,比如元数据样本列叫SampleID,就写by = c("sample_id" = "SampleID") mds_with_md <- mds %>% left_join(md, by = "sample_id")
- 用合并完成的数据集绘图,
color参数直接传数据集内的元数据列名(字符串格式,不要用$提取外部向量):
ggscatter(mds_with_md, x = "dim.1", y = "dim.2", color = "Location", palette = "jco", size = 1, ellipse = TRUE, ellipse.type = "convex", repel = TRUE)
注意:如果合并后出现元数据NA值,说明矩阵和元数据的样本名存在不匹配(比如大小写差异、多余后缀、首尾空格),需要先统一两边样本命名格式再做合并。
内容的提问来源于stack exchange,提问作者Samantha Goldman
相关产品推荐
相关产品推荐

