其他
使用 ggplot_build 函数获取绘图坐标
点击上方关注“公众号”
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:包括 data
、layout
和 plot
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 软件使用介绍
◀Ribo-seq 质控软件:ribosomeProfilingQC
◀...