R语言绘制韦恩图

前言

本篇是R语言绘制花瓣韦恩图的教程。

什么是花瓣韦恩图?

韦恩图只能画2到7个集合,当集合个数过多时,再画韦恩图就会很乱了。花瓣韦恩图可以展现所有集合共有的个数,以及每个集合独有的个数,较为清晰。

R语言绘制花瓣韦恩图

自定义函数

# 来源 https://www.r2omics.cn/
#'  花瓣图
#' @param sample 样本名称向量
#' @param num 数量向量
#' @param core 核心数量
#' @param start 起始角度(0-360度)
#' @param a 椭圆长轴长度
#' @param b 椭圆短轴长度
#' @param r 中心圆半径
#' @param ellipse_col 椭圆颜色向量
#' @param circle_col 中心圆颜色
#' @param alpha 透明度
#' @param nameSize 名称大小 
#' @param numSize 数字大小 
#' @param coreSize 共有名称大小 
flower_plot <- function(sample, num, core, start = 90, a = 0.5, b = 2, 
                        r = 1, ellipse_col, circle_col = "white",alpha,
                        nameSize=0.9,numSize=0.8,coreSize=1.2) {
  ellipse_col = adjustcolor(ellipse_col, alpha.f = alpha)
  
  
  # 设置图形参数:无边框/坐标轴/边距,强制正方形输出
  par(bty = 'n', ann = F, xaxt = 'n', yaxt = 'n', mar = c(1,1,1,1), pty = "s")
  
  # 创建标准化坐标系统(0-10范围保证绘图比例)
  plot(c(0,10), c(0,10), type = 'n', asp = 1)  # asp=1强制坐标轴等比例
  
  n <- length(sample)
  deg <- 360 / n  # 计算每个样本的间隔角度
  
  # 循环绘制每个样本的椭圆和标签
  lapply(seq_len(n), function(t) {
    # 计算当前椭圆中心坐标(极坐标转换)
    angle <- (start + deg * (t - 1)) * pi / 180
    x_center <- 5 + cos(angle)
    y_center <- 5 + sin(angle)
    
    # 绘制椭圆花瓣
    plotrix::draw.ellipse( 
      x = x_center,
      y = y_center,
      col = ellipse_col[t],
      border = ellipse_col[t],
      a = a, b = b, 
      angle = deg * (t - 1)  # 椭圆旋转角度
    )
    
    # 添加数量标签(内层文字)
    text(
      x = x_center + (b-0.5) * cos(angle),  # 0.5为偏移系数
      y = y_center + (b-0.5) * sin(angle),
      labels = num[t],
      cex = numSize
    )
    
    # 添加样本名称标签(外层文字)
    text(
      x = 5 + (b+1.3)  * cos(angle),
      y = 5 + (b+1.3)  * sin(angle),
      labels = sample[t],
      srt = ifelse(deg*(t-1) < 180 && deg*(t-1) > 0, 
                   deg*(t-1) - start, 
                   deg*(t-1) + start),  # 自动调整文字旋转角度
      adj = ifelse(deg*(t-1) < 180 && deg*(t-1) > 0, 1, 0),  # 自动对齐方式
      cex = nameSize
    )
  })
  
  # 绘制中心圆
  plotrix::draw.circle(5,  5, r, col = circle_col, border = NA)
  text(5, 5, paste('Core:', core), cex = coreSize, font = 2)
}

调用函数

flower_plot(
  sample = paste0("A",1:10),  # 样本名称向量
  num = 1:10,                 # 数量向量
  core = 12,                  # 核心数量
  ellipse_col = c('#6181BD','#F34800','#640A0E','#930026','#464E04',
                  '#049a0b','#4E0C66','#D00000','#FF6C00','#FF00FF',
                  '#c7475b','#00F5FF','#BDA500','#A5CFED','#f0301c',
                  '#2B8BC3','#FDA100','#54adf5','#CDD7E2','#9295C1'),
  start = 90, 
  a = 0.6,      # 椭圆长度
  b = 2,        # 椭圆宽度
  r = 1,        # 中心圆半径
  alpha=0.3,    # 颜色透明度
  nameSize=0.9, # 名称大小
  numSize=0.8,  # 数字大小
  coreSize=1.2  # 共有名称大小
)