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

R中如何关联相异度矩阵与元数据绘制带彩色分组点的MDS图

问题背景
  • 持有sourmash输出的.csv格式数据矩阵,矩阵样式参考示例:sourmash输出矩阵示例
  • 同时持有矩阵对应的元数据,可从多维度对矩阵内样本分组,元数据样式参考示例:元数据示例
  • 需求:绘制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
报错原因
  1. 你生成的mds数据集仅包含MDS两个维度的坐标值,没有和元数据md按样本ID做关联匹配,直接给color参数传外部向量md$Location时,ggscatter会优先从传入的mds数据集内匹配列名,传入外部向量一旦出现mds和md行顺序不一致、样本数不匹配的情况,就会触发长度不匹配错误,警告也是因为传入的是多元素向量,函数仅取第一个元素做判断导致的。
  2. 原有代码存在笔误:计算MDS时调用的对象是sm_test,和前面定义的sm_matrix不一致,运行时会先触发对象不存在的报错。
  3. 计算MDS时没有保留样本ID,哪怕向量长度刚好匹配,也可能出现样本和元数据错位对应的问题。
解决方案
  1. 先确认矩阵第一列为样本名、元数据内有和矩阵一一对应的样本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")
  1. 用合并完成的数据集绘图,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:06:31