前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R高级|cowplot包拼图(4):ggdraw和draw_*

R高级|cowplot包拼图(4):ggdraw和draw_*

作者头像
Chris生命科学小站
发布2023-02-28 19:49:15
发布2023-02-28 19:49:15
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

请先阅读前3期

R高级|利用cowplot包拼接图片(1)基本操作

R高级|利用cowplot包拼接图片(2)巧用NULL调节距离、排版

R高级|cowplot包拼图(3):overlap

在第3期中,我们讲了ggdraw和draw_plot命令,前者创建空画布,后者添加图层。现在,我们来详细介绍一下添加图层的命令draw_*。

0、创建图片

图片仍然使用第3期《R高级|cowplot包拼图(3):overlap》中的图A和图B。

1、draw_plot

第3期我们使用了draw_plot命令,现在我们来详细介绍一下。

画图A

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw()+
    draw_plot(A)

draw_plot共有8个参数

  1. plot:这个就是画图的对象,和plot_gird中的...和plotlist是一样,后面会专门讲解。
  2. x、y、hjust、vjust:分别设置所画图片的坐标x和y,以及与x轴、y轴的相对关系,hjust>0,表示在y轴左边,yjust>0,表示在x轴上边。
  3. scale:图片等比例缩放,默认为1,表示图片不缩放
  4. width和height:设置图片的宽度和高度

下面详细介绍一下plot参数。

plot参数可以是一个ggplot2图片,也可以是一个align_plots后的list,但是两者有区别的:ggplot2图片是可以和其它ggplot2参数合用的,但是align_plots产生的list不可以。

图A是ggplot2图片,放大y轴标题

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw()+
    draw_plot(A+
         theme(axis.title.y = element_text(size = rel(10))))

使用align_plots后产生的list

代码语言:javascript
代码运行次数:0
运行
复制
pl<-align_plots(A)
ggdraw()+
    draw_plot(pl[[1]])

单独画图是可以的,但是如果和ggplot2的其它命令一起使用,是不可以的。

代码语言:javascript
代码运行次数:0
运行
复制
pl<-align_plots(A)
ggdraw()+
    draw_plot(pl[[1]]+
         theme(axis.title.y = element_text(size = rel(10))))

这个时候不能画图,如果你想调节图A,需要在画图A阶段就调节好。

2、draw_label

draw_label共有12个参数

  1. label:添加的对象
  2. x、y、hjust、vjust和draw_plot一样
  3. fontfamily设置字体,fontface设置加粗、倾斜等
  4. color/colour设置颜色
  5. size设置大小
  6. angle设置角度
  7. lineheights设置文本线高
  8. alpha设置透明度
代码语言:javascript
代码运行次数:0
运行
复制
ggdraw() + 
    draw_plot(A)+
    draw_label(label = "watermark",
               colour = "#bf9f9f",
               size = 100,
               angle = 45)

我们看到这样就添加了“watermark”,但是水印在图片前面,我们需要把它放到图片后面,只需要先画水印,再画图即可。

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw() +
    draw_label(label = "watermark",
               colour = "#bf9f9f",
               size = 100,
               angle = 45) + 
    draw_plot(A)

3、draw_plot_label

为draw_plot图片添加label,和draw_label有点重复,参数也全部介绍过:

  • label、x、y、hjust、vjust、size、fontface、family、color/colou
代码语言:javascript
代码运行次数:0
运行
复制
ggdraw()+
    draw_plot(A) +
    draw_plot(B,scale = 0.22,
              x=0.35,y=0.3) +
    draw_plot_label(label = c('A','B'),
                    x=c(0.01,0.75),
                    y=c(1,0.95))

4、draw_figure_label

和draw_plot_label功能完全类似,并且可以直接draw_plot_label中的参数。值得一提的是position,可以等于top.left、top、top.right、bottom.left、bottom、bottom.right。

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw()+
    draw_plot(A) +
    draw_figure_label(label = 'figure A',
                      position = "bottom.left") +
    theme(plot.margin = unit(c(1,1,1,1),'cm'))

5、draw_text

和draw_label功能完全一样,只是draw_label一次只能添加1个label,而draw_text一次可以添加多个label

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw()+
    draw_plot(A) +
    draw_text(text  = c('figure A','is a box plot'),
              x=c(0.2,0.6))

6、draw_image

如果你有本地图片需要和图片一起画出来,那么可用draw_image

draw_image共有10个参数

  1. image:可以是本地图片、url、图像数据、magick包image_read函数读取的图片
  2. x、y、width、height、scale、hjust、vjust:前面都讲过
  3. clip:截断,on或者off,在scale>1时起效,但很多时候不灵
  4. interpolate:A logical value indicating whether to linearly interpolate the image (the alternative is to use nearest-neighbour interpolation, which gives a more blocky result).

比如,在G盘下有1个logo.jpg图片,我们把它画在图A上

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw() +
    draw_image(image = 'G:/logo.jpg',
               scale = 0.2,
               x=0.38,
               y=0.38) +
    draw_plot(A)

或者使用magick包中的read_image读取图片

代码语言:javascript
代码运行次数:0
运行
复制
#读取本地图片
library(magick)
logo<-image_read('G:/logo.jpg')
#画图
ggdraw() +
    draw_plot(A) +
    draw_image(logo,
              scale = 0.2,
              x=0.38,
              y=0.38)

还也可以先使用magick包中的read_image读取图片,然后使用ggplotify包中as.ggplot命令将图片转成ggplot2图片,最后连续使用draw_plot画出

代码语言:javascript
代码运行次数:0
运行
复制
#读取本地图片
library(magick)
logo<-image_read('G:/logo.jpg')
#转换为ggplot2图片
library(ggplotify)
logo.gg<-as.ggplot(logo)
#画图
ggdraw() +
    draw_plot(A) +
    draw_plot(logo.gg,
              scale = 0.2,
              x=0.38,
              y=0.38)

7、draw_line

划线,主要有2个参数

  1. x:点的x轴坐标,可以是多个
  2. y:点的y轴坐标,可以是多个

将点按照顺序连接,即成为线

代码语言:javascript
代码运行次数:0
运行
复制
ggdraw() +
    draw_line(
        x = c(0.7, 0.3),
        y = c(0.9, 0.8),
        color = "#bf9f9f", size = 2
    )

8、draw_grob

讲不来,不讲了

总结:

  1. draw_plot命令是我们最常用的,在ggdraw后添加换图
  2. draw_label、draw_text、draw_plot_label、draw_figure_label都是为图添加label的,功能类似。draw_plot_label、draw_text可以同时添加多个label/text
  3. draw_image用于添加本地图片、url、magick::image_read读取的图片、图片原数据
  4. draw_line用于划线
  5. draw_grob没有讲
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Chris生命科学小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档