zl程序教程

您现在的位置是:首页 >  其它

当前栏目

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

高级 拼图 draw cowplot
2023-06-13 09:15:24 时间

请先阅读前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

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轴标题

ggdraw()+
    draw_plot(A+
         theme(axis.title.y = element_text(size = rel(10))))

使用align_plots后产生的list

pl<-align_plots(A)
ggdraw()+
    draw_plot(pl[[1]])

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

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设置透明度
ggdraw() + 
    draw_plot(A)+
    draw_label(label = "watermark",
               colour = "#bf9f9f",
               size = 100,
               angle = 45)

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

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
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。

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

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上

ggdraw() +
    draw_image(image = 'G:/logo.jpg',
               scale = 0.2,
               x=0.38,
               y=0.38) +
    draw_plot(A)

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

#读取本地图片
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画出

#读取本地图片
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轴坐标,可以是多个

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

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没有讲