查看原文
其他

基础绘图 grid 包,你值得学习!

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


点击上方关注我们吧~


R 绘图征文啦!


01


交作业的小朋友



昨晚有位名为 “竹田鼠” 的小伙伴提交了 图例 作业,分享了他的代码和图,是用 grid 包绘制的,很不错。

这是他的图:

下面是小伙伴的代码:

library(dplyr)
library(RColorBrewer)
library(grid)
da <- data.frame(type = c(rep('a',4),rep('b',4)),
                 y = rep(1:4,2),
                 name = rep(c('Taihu','Sanjiang','Lianghu','Hani'),2))
da$type <- as.factor(da$type)
da$name <- as.factor(da$name)
da <- da %>%
  arrange(name)

grid.newpage()
grid.rect(x = mean(convertUnit(unit(da$type, 'inches'),unitTo = 'npc')),
          y = mean(convertUnit(unit(da$name, 'inches'),unitTo = 'npc')),
          width = max(convertUnit(unit(unique(da$type), 'inches'),unitTo = 'npc')),
          height = max(convertUnit(unit(unique(da$name), 'inches'),unitTo = 'npc')))

col_list <- brewer.pal(9,'Set1')[unique(da$name)]
grid.segments(x0 = rep(convertUnit(unit(da$type[1], 'inches'),unitTo = 'npc'), nrow(da)),
              x1 =  rep(convertUnit(unit(da$type[2], 'inches'),unitTo = 'npc'), nrow(da)),
              y0 =  convertUnit(unit(convertUnit(unit(unique(da$name), 'inches'),unitTo = 'npc'), 'inches'),unitTo = 'npc'),
              y1 =  convertUnit(unit(convertUnit(unit(unique(da$name), 'inches'),unitTo = 'npc'), 'inches'),unitTo = 'npc'),
              gp = gpar(col = col_list))
grid.points(x = convertUnit(unit(da$type, 'inches'),unitTo = 'npc'),
            y = convertUnit(unit(da$name, 'inches'),unitTo = 'npc'),
            pch = c(15,16)[da$type], size = unit(2'char'),
            gp = gpar(col = col_list[da$name]))
grid.text(x = min(convertUnit(unit(da$type, 'inches'),unitTo = 'npc')),
          y = max(convertUnit(unit(da$name, 'inches'),unitTo = 'npc')),
          vjust = unit(-2'npc'), hjust = unit(-0.01'npc'),
          label = 'DOM−OTU pair')

主要使用了grid.rectgrid.segmentsgrid.pointsgrid.text 几个函数绘制图形的,如果有什么不懂,欢迎在 知识星球 留言讨论。


02


我也来试试



grid 包同时也是一个绘图系统,一个底层的绘图系统,ggplotlattice 都是基于这个底层系统开发的。grid 虽然没有高级的绘图函数,但它的基础绘图函数往往能够帮我们绘制更加个性化和自定义化的复杂图形

这个包的详细教程:生信学习手册 公众号有教程,大家可以去学习一下。

安装加载:

install.packages("grid")
library(grid)

基础绘图函数(from:生信学习手册):

我们可以在 ggplot 图形上增加图形:

# 加载数据
data("mtcars")

# 加载R包
library(ggplot2)
library(grid)

# 绘图
ggplot(mtcars,aes(x = mpg,y = disp,color = factor(cyl))) +
  geom_point(size = 5) +
  theme_bw()

我们在这个图层上面添加图形和文字:

# 添加矩形
grid.rect(x = 0.8,y = 0.9,height = 0.05,width = 0.05,
          gp = gpar(col = '#035397',fill = '#39A2DB',lwd = 3))
grid.rect(x = 0.8,y = 0.8,height = 0.05,width = 0.05,
          gp = gpar(col = 'red',fill = 'green',lwd = 3))
# 添加文字
grid.text(label = 'Hello',x = 0.87,y = 0.9,
          gp = gpar(cex = 2))
grid.text(label = 'ggplot',x = 0.87,y = 0.8,
          gp = gpar(cex = 2))
grid 绘制图例

我们线绘制一个矩形看看:

# 新建画板
grid.newpage()

# 绘制矩形
grid.rect(x = 0.3,y = 0.8,
          # 矩形高度和宽度
          height = 0.1,width = 0.07,
          # 边框颜色、填充颜色、边框线粗
          gp = gpar(col = '#035397',fill = '#39A2DB',lwd = 3))

绘制一条线段:

# 绘制一条线段
grid.segments(# 线段起始位置
              x0 = 0.335,y0 = 0.8,
              # 线段终止位置
              x1 = 0.5,y1 = 0.8,
              # 颜色,线粗细
              gp = gpar(col = '#035397',lwd = 3))

绘制一个圆:

# 绘制一个圈
grid.circle(x = 0.504,y = 0.8# 圈圆心位置
            r = 0.04# 半径
            # 边框颜色、填充颜色、线粗
            gp = gpar(col = '#035397',fill = '#39A2DB',lwd = 3))

然后我们画四个就行了,给不一样的颜色,计算好位置:

# 保存变量
border = c("#035397""#5D8233","#D62AD0","#DA0037")
fill = c("#39A2DB","#CCFFBD","#FC92E3","#FA1E0E")
ypos = rev(seq(0.25,0.8,0.15))
name = c("Hani","Lianghu","Sanjiang","Taihu")

# 绘图
grid.newpage()

grid.rect(x = 0.3,y = ypos,height = 0.1,width = 0.07,
          gp = gpar(col = border,fill = fill,lwd = 3))

grid.segments(x0 = 0.335,y0 = ypos,x1 = 0.5,y1 = ypos,
              gp = gpar(col = border,lwd = 3))

grid.circle(x = 0.504,y = ypos,r = 0.04,
            gp = gpar(col = border,fill = fill,lwd = 3))

grid.text(label = 'DOM-OTU pair',x = 0.4,y = 0.85,
          gp = gpar(cex = 2))

添加文字:

# 添加文字
grid.text(label = name,x = 0.65,y = ypos,
          hjust = 0# 左对齐
          gp = gpar(cex = 1.5,col = border))

以下是 gpar 函数的具体参数(from:生信学习手册):



收官!


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

群二维码:


老俊俊微信:




知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

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

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

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

推 荐 阅 读




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

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