BMK_BioCloud
百迈客生物云平台是集生物信息分析软件、数据库以及云计算为一体的生物大数据信息分析平台。
在我们用R画图的时候常常碰到一种问题,就是我们简简单单一个对象的图无法达到我们想要的结果。可能我们是一个对象但有多种展示,需要把多个图放在一起;也可能我们要画的是多个对象,但每个对象的图其实都是并行的。
前面一种情况我理解为是多图叠加,即需要多张不同的图拼凑到一张图中。后面的情况我理解为是图形分页,即把类似的图形有序的排列展示给大家看。今天我们讨论的主题就是如何去解决上述的两种情况。
嘘,悄悄的,文末附有测试数据呢!
首先,我们针对第一种情况。其实第一种情况我们还是要划分一下。
多图叠加,其中的叠是指我们的绘图中两张或多张不同的图整合到一种图中,共用一个坐标轴。比如一张柱状图,一张曲线图合并到一张图中。
而其中的加则是指我们想合并的图之间无法共用坐标轴,我们只能在一张图中划分不同的区域加需要的多张图放置进去。
光说不练假把式,今天我们就找几个实例展示一下,让大家看下我如何处理这种常见的问题。
library('ggplot2')#这次主要是用ggplot来处理
data<>read.table(file = 'C:/Users/gaom/Desktop/R语言绘图:多图叠加和图形分页/test_data2.txt',header=F,stringsAsFactors=F,sep = '\t')#因为文件中有数字也有字符,所以建议加上stringsAsFactors=F。
head(data)
dim(data)
## [1] 48 4
第一列是染色体名,第二列和第三列分别是两种计算结果,具体意义暂时不予理会。第四列是染色体的区域,100000表示1到100000,200000表示100001到200000。我们大致知道数据结构即可。
下面我们开始画图
p1<>ggplot(data)+geom_bar(aes(x=data$V1,y=data$V3,fill = data$V4,group = data$V4),,position = 'dodge',stat = 'identity',colour = 'black')+scale_x_continuous(breaks = 1:12)#加上position='dodge'后会每条染色体分成四个柱子,加上colour = 'black',则每个柱子的边框为黑色。
p1
上面已经有对应的柱状图了,下面再根据第一列和第三列画点线图。
p2<>ggplot(data)+geom_line(aes(x=data$V1,y=data$V2,colour = data$V4))+scale_x_continuous(breaks = 1:12)#这里可以注意跟柱状图不一样了,用的是colour,不是fill。
p2
分开的两张图我们都做好了,下面就是叠加了。首先我们看到这里的数据其实都是data,换句话说就是他们其实可以共用坐标轴的。所以这种情况在ggplot当中叠起来很容易。
data[,5]='white'
p3<>ggplot(data)+geom_bar(aes(x=data$V1,y=data$V3,group = data$V4),fill = data$V5,position = 'dodge',stat = 'identity',colour = 'black')+geom_line(aes(x=data$V1,y=data$V2,colour = data$V4))+scale_x_continuous(breaks = 1:12)#为了能看到线图,所以这里把填充颜色改成了白色,这里大家注意一下fill的位置,跟之前的fill运用有些区别
p3
这里说完了叠,再说说加。下面我们就简单的把上面两张图加到一张图中。
library('gridExtra')
grid.arrange(p1,p2,ncol = 2,widths=c(1,1))#widths表示横向两图的比例
grid.arrange(p1,p2,nrow = 2,heights = c(1,2))#heights表示两图纵向的比例
grid.arrange(p1,p2,p1,p2,ncol =2,nrow =2)#ncol和nrow表示图形摆放方式
grid.arrange(p1,p2,p1,p2,ncol =2,layout_matrix = cbind(c(1,1,1), c(2,3,4)))#layout_matrix中的1,2,3,4分别对应前面四个对象
除了上述情况,相信大家还会碰到另外一种,比如上述四个图拼在一起。而我们只有三个图,可能右上角或左上角是空白的。这个怎么办呢?
kong<> ggplot()+geom_blank(aes(1,1))+
theme(plot.background = element_blank(), panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),panel.border = element_blank(),
panel.background = element_blank(),axis.title.x = element_blank(),
axis.title.y = element_blank(),axis.text.x = element_blank(),
axis.text.y = element_blank(),axis.ticks = element_blank(),
axis.line = element_blank())#这里其实就是建立了一个完全空白的图片
grid.arrange(p2,kong,p1,p2,ncol =2 ,nrow =2,widths = c(2,1),heights = c(1,2))
上述了这些就是一般常见的图层叠加了。当然,如果大家还想发散的话,可以再参考一些ggExtra这个包,你会发现更多乐趣。
好了,除了刚才的叠加,下面我们再说说分页。这方面在ggplot中就显得很容易了。
p4<>ggplot(data)+geom_bar(aes(x=data$V1,y=data$V3,fill = data$V4,group = data$V4),,position = 'dodge',stat = 'identity',colour = 'black')+scale_x_continuous(breaks = 1:12)+facet_grid(~V4)#这是根据分组来分页的
p4
p5<>ggplot(data)+geom_bar(aes(x=data$V1,y=data$V3,fill = data$V4,group = data$V4),,position = 'dodge',stat = 'identity',colour = 'black')+scale_x_continuous(breaks = 1:12)+facet_wrap(~V1,ncol = 3)#这个是根据染色体的,同时也能通过ncol和nrow来调控布局
p5
facet_grid相对facet_wrap而言可以应用多个标准进行分页。但从布局角度个人觉得facet_wrap更好。
p6<>ggplot(data)+geom_bar(aes(x=data$V1,y=data$V3,fill = data$V4,group = data$V4),,position = 'dodge',stat = 'identity',colour = 'black')+scale_x_continuous(breaks = 1:12)+facet_grid(V1~V4)#这是根据分组和染色体一起来分页的
p6
联系客服