ggplot收尾篇 神助攻gridExtra
2018-09-02 本文已影响170人
小洁忘了怎么分身
微信公众号生信星球同步更新我的文章
也就是说 1,2在第一行,3占据第二行。
终于要收尾啦!!开心到飞起
1.示例数据
在公众号回复:dexp.csv,获得示例数据。
示例数据和学习内容来自基因课。
读取数据:
dexp <- read.csv("dexp.csv",row.names = 1)#设置第一列为行名
library(ggplot2)
library(gridExtra)
示例数据:40个基因,每个基因9个重复,加上这9个重复各自的观测值,以及每个基因的长度。
作三种不同类型的图:
p <- ggplot(data = dexp)
##密度图
p_density <- p + geom_density(
aes(Expression, color = Sample)
)
##箱线图
p_boxplot <- p + geom_boxplot(
aes(x = Sample, y = Expression, color = Group)
)
data_boxplot <- ggplot_build(p_boxplot)$data[[1]]
##小提琴图
p_violin <- p + geom_violin(
aes(x = Sample, y = Expression, fill = Group)
)
2.拼图小成
之前用过grid.arrange这个函数,可以将三个图拼起来
grid.arrange(p_density, p_boxplot, p_violin)
此处提出进阶做法:将图片存放在列表中,拼图时直接读取列表。在要拼的图片较多时就会看到他的好处。
plots <- list(p_density, p_boxplot, p_violin)
grid.arrange(grobs = plots)
#用列表存放图片名称,列表是一种特殊的格式,可以存放其他数据类型
3.自定义图片布局
(1)简单布局
设置每列显示几个图用ncol,此外还可以给拼后的图片加标题,注意,单个图片的标题设置用title,这里设置拼后的名字,直接用top
grid.arrange(grobs = plots, ncol = 2,
top = "bioinfoplanet")
(2)复杂布局
如果想让小提琴图占第二行的正行,应该怎么做?
答案是设置一个布局矩阵,让三张图片根据这个布局来排列。
lay1 = rbind(c(1, 2),
c(3, 3)) #布局矩阵
grid.arrange(grobs = plots,
layout_matrix = lay1) #等于一个布局matrix 矩阵
注意,这里的1,2,3是编号顺序,是根据列表里图片名称顺序来决定的。
此外rbind是行拼接的意思,把两个向量按照行拼接起来,就成为一个表格,我们用这个表格来做表达矩阵。
也就是说 1,2在第一行,3占据第二行。
lay2 = rbind(c(1, 3),
c(2, 3))
grid.arrange(grobs = plots,
layout_matrix = lay1,
widths = c(1, 2), #第一列的宽度为1,第二列的宽度为2
heigths = c(1, 0.5)) #第二行的高度设置小,为什么我没有发现变化
widths 和heigths是对图片的宽度和高度进行设计,这里用向量的形式设置了列之间的宽度比例,行之间的高度比例。但我这里高度调整没有成功,暂时没有找出原因,有看懂的读者欢迎指出哦。
(3)更复杂的网状布局
arrangeGrob和gridarrange的区别是,前者可以赋值给一个变量。
p1 <- arrangeGrob(grobs = plots,
layout_matrix = lay1)
p2 <- arrangeGrob(grobs = plots,
layout_matrix = lay2)
grid.arrange(p1, p2, ncol = 2)
当需要更复杂的拼接的时候会需要用到。
####(4)生成多页导出为pdf
ml <- marrangeGrob(grobs = plots, nrow=2, ncol=1) #m表示多个,每页两列一行,也就是两个图,注意这里的行数列数是每页的分布,缺一不可。
ggsave("multipage.pdf", ml)
刚才豆豆同学扔来几行代码
正好补充上 coord_flip(翻转坐标系)和coord_polar(极坐标系)
bar <- ggplot(diamonds)+
geom_bar(aes(x= cut, fill=cut),
show.legend = F,
width = 1)+
theme(aspect.ratio = 1)+
labs(x = "Doodle", y = "Jessie")
#对比一下
bar1 <- bar + coord_flip()
bar2 <- bar + coord_polar()
grid.arrange(bar1,bar2, ncol = 2)
暂时不明白这个配色梯度怎么和我的不一样