打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一个对策,告别多图慎点!

一个对策,告别多图慎点!

2017-01-13 GM 百迈客云平台
百迈客云平台

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)#ncolnrow表示图形摆放方式


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)#这个是根据染色体的,同时也能通过ncolnrow来调控布局
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


阅读
精选留言

该文章作者已设置需关注才可以留言

写留言

    该文章作者已设置需关注才可以留言

    写留言

    加载中
    以上留言由公众号筛选后显示

    了解留言功能详情

    本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    复现SCI图表:ggplot做花瓣图
    ggplot2绘制堆积柱形图
    手把手教你R语言绘制“火山图”
    基因组干货#之烂大街的GOhttp://upload-images.jianshu.io/upload_images/903467-696e5a5054e2cac0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/554、KEGG分析作图
    森林图之初体验
    干货|高逼格的sci图片手把手教学
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服