← 返回 Tessera
Toy4,413 行 × 6406 KB无缺失数据 2026-08-18

pbmc5k_donor4_embeddings

4,413 个真实 PBMC、17 个无监督聚类和同一批细胞的 UMAP / t-SNE 坐标——多类别点云、降维图与定性色板的练习数据。

10x Genomics 5k Human PBMCs Donor 4(Cell Ranger 9.0.0) · 收录于 2026-08-18

下载 CSV · 406 KB
数据预览6
cell_idclusterumap_1umap_2tsne_1tsne_2
AAACCAAAGGCGCTTG-1112.9-0.227-30.0-1.66
AAACCAAAGTAGGACG-18-5.580.509-13.6-5.43
AAACCATTCCAGCTAA-10-8.7-2.74-6.6213.7
AAACCATTCCATCCGC-192.518.91-8.2-22.8
AAACCATTCGACCAGT-13-4.44-4.887.140.406
AAACCCTGTGATGAAT-1113.3-1.01-40.76.24
变量6
字符型1整数1双精度4
类型
#变量类型缺失统计
1cell_idkey10x filtered feature-barcode matrix · barcodes.tsv.gz字符型不同值 4413AAACCAAAGGCGCTTG-1 · AAACCAAAGTAGGACG-1 · AAACCATTCCAGCTAA-1 · AAACCATTCCATCCGC-1 · AAACCATTCGACCAGT-1 · AAACCCTGTGATGAAT-1 · AAACCGCTCATGTCGA-1 · AAACGAATCAGCAACC-1
2clusterSeurat · FindClusters(Louvain;resolution = 0.8)整数min 0q1 中位 3均值 3.89q3 max 16.0
3umap_1Seurat · RunUMAP(PC 1–20;seed = 1)双精度min -13.7q1 中位 -2.88均值 -1.3e-16q3 max 14.5
4umap_2Seurat · RunUMAP(PC 1–20;seed = 1)双精度min -8.48q1 中位 -2.12均值 1.6e-16q3 max 17.2
5tsne_1Seurat · RunTSNE(PC 1–20;seed = 1)双精度min -46.5q1 中位 1.98均值 3.5e-16q3 max 43.5
6tsne_2Seurat · RunTSNE(PC 1–20;seed = 1)双精度min -44.4q1 中位 1.49均值 1.8e-16q3 max 43.0
载入已写好列类型
library(readr)

pbmc5k_donor4_embeddings <- read_csv(
  "https://assets.evanzhou.org/tessera/csv/pbmc5k_donor4_embeddings.csv",
  col_types = cols(
    cell_id = col_character(),
    cluster = col_integer(),
    umap_1  = col_double(),
    umap_2  = col_double(),
    tsne_1  = col_double(),
    tsne_2  = col_double()
  )
)
URLhttps://assets.evanzhou.org/tessera/csv/pbmc5k_donor4_embeddings.csv

来源

原始数据是 10x Genomics 发布的 5k Human PBMCs, Donor 4:健康供者的外周血单核细胞,使用 Chromium GEM-X Single Cell 3′ v4 与 Cell Ranger 9.0.0。生成脚本直接从下载目录里的 barcodes.tsv.gzfeatures.tsv.gzmatrix.mtx.gz 开始,不读取任何预先处理的对象。

脚本依次完成固定阈值 QC、LogNormalize、2,000 个高变基因、PCA、邻居图、Louvain 聚类、UMAP 和 t-SNE,再只导出作图所需的六列。UMAP 和 t-SNE 使用同一批 QC 后细胞,因此两张图可以共用完全相同的颜色映射进行比较。所有随机步骤固定 seed = 1;CSV 是这条公开流程的冻结结果,而不是手工整理的坐标。

为什么只写 cluster

cluster 是固定流程在 resolution = 0.8 下产生的 17 个无监督聚类编号。它不是细胞类型,也不是实验真值;数字之间没有大小或生物学顺序。对一份用来检查配色的 toy data,保留可核对的聚类结果比再引入参考库、marker 选择和人工判断更诚实。

同样,UMAP 或 t-SNE 上两个簇相距多远,不应被解释为对应细胞群的生物学距离。这里保留坐标是为了练习绘图和比较颜色,而不是提供 PBMC 生物学参考图谱。

适用图形

图形结构 用途
UMAP 检查定性色板在密集、相邻和大小不均的簇中是否仍可辨认
t-SNE 用同一批细胞比较另一种局部结构更突出的二维嵌入
分面降维图 将 16 个 cluster 分面,检查小簇和稀疏边界
聚类规模图 按 cluster 汇总细胞数,配合点云判断视觉面积是否误导
生成脚本R · 124
# Build Tessera's compact UMAP / t-SNE toy directly from the three files in a
# 10x Genomics filtered feature-barcode matrix directory:
#   barcodes.tsv.gz · features.tsv.gz · matrix.mtx.gz
#
# Usage:
#   Rscript pbmc5k_donor4_embeddings.R <10x-directory> [output.csv]
#
# The committed snapshot was generated from 10x Genomics' 5k Human PBMCs,
# Donor 4, analyzed with Cell Ranger 9.0.0. Cluster numbers are deliberately
# left as unsupervised labels; this script performs no cell-type annotation.

args <- commandArgs(trailingOnly = TRUE)
if (length(args) < 1L) {
  stop("Provide the 10x filtered feature-barcode matrix directory", call. = FALSE)
}

input <- args[[1L]]
output <- if (length(args) >= 2L) args[[2L]] else "pbmc5k_donor4_embeddings.csv"
required_files <- c("barcodes.tsv.gz", "features.tsv.gz", "matrix.mtx.gz")
missing_files <- required_files[!file.exists(file.path(input, required_files))]
if (length(missing_files)) {
  stop("Missing 10x files: ", paste(missing_files, collapse = ", "), call. = FALSE)
}

set.seed(1)
counts <- Seurat::Read10X(
  data.dir = input,
  gene.column = 2,
  cell.column = 1,
  unique.features = TRUE,
  strip.suffix = FALSE
)
pbmc <- Seurat::CreateSeuratObject(
  counts = counts,
  project = "pbmc5k_donor4",
  min.cells = 3,
  min.features = 40
)

# Transparent, fixed QC bounds. The upper UMI / feature limits also remove the
# most conspicuous high-complexity droplets without adding a doublet caller and
# another model-dependent label to this plotting dataset.
pbmc[["percent_mito"]] <- Seurat::PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(
  pbmc,
  subset = nCount_RNA >= 500 & nCount_RNA <= 15000 &
    nFeature_RNA >= 200 & nFeature_RNA <= 5000 & percent_mito < 10
)

pbmc <- Seurat::NormalizeData(
  pbmc,
  normalization.method = "LogNormalize",
  scale.factor = 10000,
  verbose = FALSE
)
pbmc <- Seurat::FindVariableFeatures(
  pbmc,
  selection.method = "vst",
  nfeatures = 2000,
  verbose = FALSE
)
pbmc <- Seurat::ScaleData(
  pbmc,
  features = Seurat::VariableFeatures(pbmc),
  verbose = FALSE
)
pbmc <- Seurat::RunPCA(
  pbmc,
  features = Seurat::VariableFeatures(pbmc),
  npcs = 30,
  seed.use = 1,
  verbose = FALSE
)
pbmc <- Seurat::FindNeighbors(
  pbmc,
  reduction = "pca",
  dims = 1:20,
  k.param = 20,
  verbose = FALSE
)
pbmc <- Seurat::FindClusters(
  pbmc,
  resolution = 0.8,
  algorithm = 1,
  random.seed = 1,
  verbose = FALSE
)
pbmc <- Seurat::RunUMAP(
  pbmc,
  reduction = "pca",
  dims = 1:20,
  n.neighbors = 30,
  min.dist = 0.3,
  n.components = 2,
  seed.use = 1,
  verbose = FALSE
)
pbmc <- Seurat::RunTSNE(
  pbmc,
  reduction = "pca",
  dims = 1:20,
  dim.embed = 2,
  seed.use = 1,
  verbose = FALSE
)

umap <- SeuratObject::Embeddings(pbmc, "umap")
tsne <- SeuratObject::Embeddings(pbmc, "tsne")
cells <- colnames(pbmc)
stopifnot(
  identical(cells, rownames(umap)),
  identical(cells, rownames(tsne))
)

frozen <- data.frame(
  cell_id = cells,
  cluster = as.integer(as.character(pbmc$seurat_clusters)),
  umap_1 = unname(umap[, 1L]),
  umap_2 = unname(umap[, 2L]),
  tsne_1 = unname(tsne[, 1L]),
  tsne_2 = unname(tsne[, 2L]),
  check.names = FALSE
)
write.csv(frozen, output, row.names = FALSE)

表中统计由 scripts/profile_dataset.py 于 2026-08-18 数出。