单细胞配色效果模拟器 | 简陋版(输入已有颜色列表)

目的:假设你有一组颜色了,怎么模拟查看它们在单细胞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: 自定义颜色,随机打乱后。

100. 怎么获取颜色组合?

  • 热播电视剧庆余年配色:https://blog.youkuaiyun.com/weixin_47195452/article/details/144150440
  • 从大自然照片中获取配色灵感:https://blog.youkuaiyun.com/wangjunliang/article/details/144133217
  • R包的2100多个调色板:https://blog.youkuaiyun.com/wangjunliang/article/details/143213277

End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值