查看原文
其他

使用 ggplot_build 函数获取绘图坐标

JunJunLab 老俊俊的生信笔记 2022-08-15


点击上方关注“公众号”

1、起源

之前我们给图形添加注释图层时,都是根据手 动计算坐标位置 来添加注释图层的,那么有没有一种简便的方式自动提取绘图里元素的坐标呢?答案是有的。

ggplot_build() 获取绘图对象,并执行生成可渲染对象所需的所有步骤。此函数输出两部分:数据框列表(每个图层一个)和面板对象,其中包含有关轴范围、刻度等的所有信息。

如果我们想提取每个图层的坐标信息,直接从 ggplot_build 函数返回的对象里提取即可,不需再手动计算。

接下来我们以 条形图 为例,添加注释图层。

2、探索

构造数据:

# 加载R包
library(reshape2)
library(tidyverse)
library(ggnewscale)
library(ggplot2)

# 构造数据
set.seed(123)
df <- as.data.frame(matrix(data = sample(0:50,100,replace = T),ncol = 5))

# 给列命名
colnames(df) <- c('Heterogeneous selection','Homogeneous selection',
                  'Dispersal limitation','Homogenizing dispersal',
                  'Undominated')

# 添加分类
df$x <- factor(rownames(df),levels = rownames(df))

# 查看数据
head(df,3)
  Heterogeneous selection Homogeneous selection Dispersal limitation
1                      30                     7                   22
2                      14                    25                   26
3                      50                     6                    6
  Homogenizing dispersal Undominated x
1                     40           4 1
2                     46          50 2
3                     25          24 3

da <- melt(df)

绘图:

# 绘图
p <- ggplot(data = da) +
  # 柱形图层
  geom_col(aes(x = x,y = value,fill = variable),
           # color ='black',
           position = position_fill()) +
  # 颜色
  scale_fill_brewer(palette = 'Set1') +
  theme_classic(base_size = 18)
p

接下来提取信息:

# 提取绘图信息
info_coord <- ggplot_build(p)

可以看到,对象是一个 list:包括 datalayoutplot 3 个元素,所有图层的的信息在 data 里,我们提取 data 看看:

# 提取data
info <- info_coord$data[[1]]

可以看到正好对应图形的每个柱子的 起始位置终止位置高度颜色分组 等内容,我们可以拿这个信息绘制基本一样的图形出来:

# geom_rect绘图
ggplot(info) +
  geom_rect(aes(xmin = xmin,xmax = xmax,
                ymin = ymin,ymax = ymax,
                fill = fill))

下面提取坐标加入自己的分组信息:

# 提取坐标,去重,分组
anno_coord <- data.frame(xmin = unique(info$xmin),
                         xmax = unique(info$xmax),
                         type = c(rep(LETTERS[1:4],each = 5)),
                         type2 = letters[1:5])

anno_coord
    xmin  xmax type type2
1   0.55  1.45    A     a
2   1.55  2.45    A     b
3   2.55  3.45    A     c
4   3.55  4.45    A     d
5   4.55  5.45    A     e
6   5.55  6.45    B     a
7   6.55  7.45    B     b
8   7.55  8.45    B     c
9   8.55  9.45    B     d
10  9.55 10.45    B     e
11 10.55 11.45    C     a
12 11.55 12.45    C     b
13 12.55 13.45    C     c
14 13.55 14.45    C     d
15 14.55 15.45    C     e
16 15.55 16.45    D     a
17 16.55 17.45    D     b
18 17.55 18.45    D     c
19 18.55 19.45    D     d
20 19.55 20.45    D     e

绘图:

# 添加注释
p +
  new_scale('fill') +
  geom_rect(data = anno_coord,aes(xmin = xmin,xmax = xmax,
                                  ymin = -0.05,ymax = -0.025,fill = type)) +
  new_scale('fill') +
  geom_rect(data = anno_coord,aes(xmin = xmin,xmax = xmax,
                                  ymin = -0.085,ymax = -0.06,fill = type2))

在顶部添加注释:

# 在上面添加注释
anno_up <- anno_coord[c(1,6,11,16),]
anno_up$xmax <- anno_up$xmax + 4
anno_up$type3 <- c('one','two','three','four')

anno_up
    xmin  xmax type type2 type3
1   0.55  5.45    A     a   one
6   5.55 10.45    B     a   two
11 10.55 15.45    C     a three
16 15.55 20.45    D     a  four

# 绘图
p +
  new_scale('fill') +
  geom_rect(data = anno_coord,aes(xmin = xmin,xmax = xmax,
                                  ymin = -0.05,ymax = -0.025,fill = type)) +
  new_scale('fill') +
  geom_rect(data = anno_coord,aes(xmin = xmin,xmax = xmax,
                                  ymin = -0.085,ymax = -0.06,fill = type2)) +
  new_scale('fill') +
  geom_rect(data = anno_up,aes(xmin = xmin,xmax = xmax,
                               ymin = 1.025,ymax = 1.05,fill = type3))

3、自然





欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 哦,代码已上传至QQ群文件夹,欢迎下载。

群二维码:




老俊俊微信:




知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!





 往期回顾 




circRNAs 定量之 CIRIquant 软件使用介绍

ggplot 绘制环形堆叠条形图

circRNAs 定量之 CIRIquant 软件

怎么在 UCSC 官网下载基因组和注释文件?

ggplot 绘制三角形相关性图

clusterProfiler 的 shiny 版

我的 Ubuntu 启动项不见了?

Ribo-seq 质控软件:ribosomeProfilingQC

barplot 还不会添加误差线?你点进来就会了!

跟着 Hindawi 学画图:漂亮的火山图

◀...


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存