pythonic生物人

复现Nature图,换数据可用!

本次使用R语言复现Nature正刊上的Fig.3a图,

Image

复现效果图,

ImageImageImage

这张图一次性展示一组连续变量之间的线性相关强度、联合分布形态,由三部分构成:

  • 上三角,显示Spearman相关系数,颜色越深越接近 1,越浅接近0。
  • 下三角,显示二维密度等高线图,反映变量的联合分布。
  • 对角线,是变量名(sp4+、spd3+、CoH3+、PEG、Ca2+、HP1α、HP1β)。

R实现

  • 读入数据
Image
  • 右上角,Spearman相关系数热图
upper_fn <- function(data, mapping, ...) {

  x <- eval_data_col(data, mapping$x)
  y <- eval_data_col(data, mapping$y)

# 计算Spearman相关系数
  r <- cor(x, y, method = "spearman")

# 根据相关系数大小决定文字颜色(低相关用白色,高相关用黑色)
  label_col <- ifelse(r < 0.35, "white", "black")

# 热图
  ggplot(data.frame(x = 1, y = 1, r = r), aes(x, y)) +

# 画方块
    geom_tile(
      aes(fill = r),
      colour = "#4d4d4d",   # 方格边框颜色
      linewidth = 0.7
    ) +

# 添加相关系数文本
    geom_text(
      aes(label = sub("0+$", "", sub("\\.$", "", sprintf("%.2f", r)))),
      size = 7,
      colour = label_col,
      family = "Arial"
    ) +

# 自定义渐变颜色
    scale_fill_gradientn(
      colours = c(
"#0b32ff", "#3f8cff", "#9be37d",
"#f2e84a", "#f28e2b", "#e31a1c"
      ),
      limits = c(0.1, 0.8),
      oob = squish   # 超出范围的值压缩到边界
    ) +

    coord_fixed() +  # 保持正方形

    theme_void() +   # 去除所有背景元素

    theme(
      legend.position = "none",   # 不显示图例
      plot.margin = margin(1, 1, 1, 1)
    )
}
Image
  • 左下角:二维密度散点图
lower_fn <- function(data, mapping, ...) {

  ggplot(data, mapping) +

# 等高线填充的密度图
    stat_density_2d(
      aes(fill = after_stat(level)),
      geom = "polygon",
      contour = TRUE,
      n = 300,
      bins = 8,
      alpha = 1
    ) +

# 自定义密度颜色
    scale_fill_gradientn(
      colours = c(
"#d9f0f3", "#7fcdbb", "#41b6c4",
"#f0e442", "#e31a1c"
      )
    ) +

    theme_bw() +

    theme(
      axis.text = element_text(size = 7, colour = "black"),
      axis.title = element_blank(),
      axis.ticks = element_line(linewidth = 0.3, colour = "black"),
      axis.line = element_line(linewidth = 0.3, colour = "black"),
      panel.grid = element_blank(),
      panel.border = element_rect(
        colour = "#4d4d4d",
        fill = NA,
        linewidth = 0.6
      ),
      panel.background = element_rect(fill = "white"),
      legend.position = "none"
    )
}
Image
  • 对角线,变量名称
diag_fn <- function(data, mapping, ...) {

  ggplot() +

# 在对角格中标注变量名
    annotate(
"text",
      x = 0.5,
      y = 0.5,
      label = mapping$x,
      size = 6,
      family = "Arial"
    ) +

    theme_void()
}
Image
  • 上中下三部分拼接
p <- ggpairs(
  df,
  lower = list(continuous = lower_fn),  # 左下角
  upper = list(continuous = upper_fn),  # 右上角
  diag  = list(continuous = diag_fn)    # 对角线
)
Image

本期结束!


推荐《👉保姆级R可视化教程》,39个章节,数百张图,旨在引导如何系统学习R语言可视化,部分展示如下:
图片

图片
复现效果图-abcd图❤️
复现效果图-b图❤️
图片
❤️复现效果图-ABCD图❤️
图片
❤️复现效果图-bcd图❤️
图片
图片
❤️复现效果图-b图❤️
图片
图片
图片
图片
图片
图片
图片
图片
图片
图片

图片

图片
图片
图片

(加入学习,收费,备注:299)

图片