R高级|cowplot包拼图(4):ggdraw和draw_*
请先阅读前3期
R高级|利用cowplot包拼接图片(2)巧用NULL调节距离、排版
在第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个参数
- plot:这个就是画图的对象,和plot_gird中的...和plotlist是一样,后面会专门讲解。
- x、y、hjust、vjust:分别设置所画图片的坐标x和y,以及与x轴、y轴的相对关系,hjust>0,表示在y轴左边,yjust>0,表示在x轴上边。
- scale:图片等比例缩放,默认为1,表示图片不缩放
- 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个参数
- label:添加的对象
- x、y、hjust、vjust和draw_plot一样
- fontfamily设置字体,fontface设置加粗、倾斜等
- color/colour设置颜色
- size设置大小
- angle设置角度
- lineheights设置文本线高
- 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个参数
- image:可以是本地图片、url、图像数据、magick包image_read函数读取的图片
- x、y、width、height、scale、hjust、vjust:前面都讲过
- clip:截断,on或者off,在scale>1时起效,但很多时候不灵
- 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个参数
- x:点的x轴坐标,可以是多个
- y:点的y轴坐标,可以是多个
将点按照顺序连接,即成为线
ggdraw() +
draw_line(
x = c(0.7, 0.3),
y = c(0.9, 0.8),
color = "#bf9f9f", size = 2
)
8、draw_grob
讲不来,不讲了
总结:
- draw_plot命令是我们最常用的,在ggdraw后添加换图
- draw_label、draw_text、draw_plot_label、draw_figure_label都是为图添加label的,功能类似。draw_plot_label、draw_text可以同时添加多个label/text
- draw_image用于添加本地图片、url、magick::image_read读取的图片、图片原数据
- draw_line用于划线
- draw_grob没有讲