目的:假设你有一组颜色了,怎么模拟查看它们在单细胞DimPlot中的美学效果呢?要足够快,还要尽可能有模拟效果。
1. 尝试1: 随机矩阵,真的UMAP降维后绘图(失败)
造一个随机矩阵,使用Seurat包使用的 uwot::umap 降维后,可视化。
效果:差的一塌糊涂!慢且效果差。
# 1. 创建随机数据矩阵
set.seed(123)
n_cells <- 2000
data_matrix <- matrix(rnorm(n_cells * 10), nrow = n_cells, ncol = 10)
dim(data_matrix)
# 2. umap
# input row as cells,
# return: keep row number, but only 2 columns as UMAP1-2
umap_result <- uwot::umap(data_matrix[,1:2])
dim(umap_result)
# 3. draw
#
color_scheme <- c("Group A" = "blue", "Group B" = "red")
umap_df <- data.frame(UMAP1 = umap_result[, 1], UMAP2 = umap_result[, 2])
umap_df$group <- sample(c("Group A", "Group B"), n_cells, replace = TRUE)
library(ggplot2)
umap_plot <- ggplot(umap_df, aes(x = UMAP1, y = UMAP2, color = group)) +
geom_point(size = 3) +
scale_color_manual(values = color_scheme) +
ggtitle("UMAP of Random Data with Color Testing") +
theme_minimal()
umap_plot
这个效果不可预测耗时,且不能稳定cluster颜色。
2. try2: 单位圆平分后随机点法
基于简单数学原理,才能更快。
进一步地,把这个数据输入做umap后,再绘图也行,但是太耗时,且效果也一般。
#' 一套颜色在单细胞点图的模拟效果
#'
#' version:0.2
#'
#' @param colors2 颜色向量
#' @param pt.size 点的大小
#' @param dot.per.cluster 每个类产生颜色数量
#' @param cluster_number 主类大小,不设置,则表示和颜色总数一致
#' @param radius 主图半径,默认即可
#' @param zoom.factor 针对主图放大倍数
#' @param scale.factor 随机点沿着核心点间距的缩放倍数
#' @param shuffle 是否对颜色随机打乱,默认不随机
#'
#' @return 无返回值,就一个绘图效果
#' @export
#'
#' @examples
show_colorset=function(
colors2,
pt.size=1,
dot.per.cluster=100,
cluster_number=0,
radius=10,
zoom.factor=2, #绘制核心点时,整体放大倍数,方便个后续随机点留下空间
scale.factor=6,
shuffle=F,
main=""
){
message(length(colors2))
if(cluster_number<=0){
cluster_number = length(colors2)
}
if(shuffle){
colors2=sample(colors2)
}
#1.确定几个核心点
arr_x= radius * cos(2*pi / cluster_number* (1:cluster_number))
arr_y= radius * sin(2*pi / cluster_number* (1:cluster_number))
#2.计算两点的距离
dot_dist = sqrt( (arr_x[1]-arr_x[2])**2 + (arr_y[1]-arr_y[2])**2); dot_dist
#3.噪音点,随机分布在核心点周围,距离大概是:核心点距离/scale.factor
noiseX = dot_dist*rnorm(n=dot.per.cluster)/scale.factor
noiseY = dot_dist*rnorm(n=dot.per.cluster)/scale.factor
#3. 绘制空坐标轴
main=ifelse(main=="", "Color test", main)
plot(arr_x*zoom.factor, arr_y*zoom.factor, col="white", xlab="UMAP_1", ylab="UMAP_2", main=main, mgp=c(2,1,0))
#4. 绘制噪音点
for(i in 1:cluster_number){
points(arr_x[i] + sample(noiseX), arr_y[i]+sample(noiseY), col=colors2[i], pch=19, cex=pt.size)
}
}
使用效果:
if(0){
show_colorset( DiscretePalette(26, palette='alphabet')[1:10], dot.per.cluster=500, zoom.factor = 1.2, pt.size = 2, main="alphabet")
show_colorset( c("red", "orange", "blue", "navy", "cyan", "grey"), dot.per.cluster=2000, zoom.factor = 2)
show_colorset( c("red", "orange", "blue", "navy", "cyan", "grey"), dot.per.cluster=2000, zoom.factor = 2, shuffle = T )
}
Fig:
- left: Seurat自带的颜色 DiscretePalette(26, palette=‘alphabet’) 前10个
- mid: 自定义颜色
- right: 自定义颜色,随机打乱后。