前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >画韦恩图那么容易,为什么拿到指定元素却有问题

画韦恩图那么容易,为什么拿到指定元素却有问题

作者头像
生信技能树
发布2020-12-17 11:13:36
8160
发布2020-12-17 11:13:36
举报
文章被收录于专栏:生信技能树

学员交流群有提问,说他虽然会绘制韦恩图了,但是想提取图中指定的元素,自己弄的代码非常笨拙,感觉是R语言学的不够好,希望我可以秀一秀高阶代码。恰好今天没有什么可以分享的,就写这个教程吧!

首先设置4个随机的向量

代码语言:javascript
复制
set.seed(123456789)
g1=LETTERS[sample(1:26,15)]
g2=LETTERS[sample(1:26,15)]
g3=LETTERS[sample(1:26,15)]
g4=LETTERS[sample(1:26,15)]
VENN.LIST=list(g1=g1,
               g2=g2,
               g3=g3,
               g4=g4)
VENN.LIST

一般来说,这4个向量里面的元素大概率是有交集的:

代码语言:javascript
复制
> VENN.LIST
$g1
 [1] "T" "B" "G" "P" "K" "L" "M" "X" "U" "I" "R" "J" "O" "E" "S"

$g2
 [1] "F" "J" "O" "L" "Z" "D" "M" "N" "I" "T" "P" "B" "E" "C" "U"

$g3
 [1] "G" "M" "U" "F" "Y" "I" "W" "Q" "H" "J" "T" "A" "X" "E" "C"

$g4
 [1] "P" "M" "O" "N" "S" "Y" "Q" "K" "U" "W" "T" "G" "C" "F" "H"

然后绘制韦恩图

代码随处可以搜索到:

代码语言:javascript
复制
require("VennDiagram") 
venn.plot <- venn.diagram(VENN.LIST , NULL, 
                          fill=c("red", "blue",'green','black'), 
                          alpha=c(0.5,0.5,0.5,0.5), cex = 2, cat.fontface=4, 
                          category.names= names(VENN.LIST), 
                          main="venn.diagram")
grid.draw(venn.plot)

出图如下所示:

可以制作csv表格

代码如下:

代码语言:javascript
复制
x=VENN.LIST
names(x)
id=unique(unlist(x))
id
y=do.call(cbind,lapply(x, function(i){
  sign( id %in% i)
}))
rownames(y)=id
y=data.frame(y)
y$sum=rowSums(y)
y=y[order(y$sum,decreasing = T),]
head(y)

会得到如下所示的表格:

代码语言:javascript
复制
> head(y)
  g1 g2 g3 g4 sum
T  1  1  1  1   4
M  1  1  1  1   4
U  1  1  1  1   4
G  1  0  1  1   3
P  1  1  0  1   3
I  1  1  1  0   3

可以看到,出现4次的元素是 T,M,U 这3个,跟前面的韦恩图是对应的。

这个时候,如果你的合作者并不擅长代码,可以直接打开这个csv文件,根据sum列进行筛选即可。

或者代码提取元素

代码语言:javascript
复制
z=apply(y,1,function(x){paste(x[1:4],collapse = '-')})
as.data.frame(sort(table(z)))

如下所示:

代码语言:javascript
复制
> as.data.frame(sort(table(z)))
         z Freq
1  0-0-1-0    1
2  0-1-0-1    1
3  1-0-0-0    1
4  1-0-1-0    1
5  1-0-1-1    1
6  0-1-0-0    2
7  0-1-1-1    2
8  1-0-0-1    2
9  1-1-0-0    2
10 1-1-0-1    2
11 1-1-1-0    3
12 1-1-1-1    3
13 0-0-1-1    4
> which(z=='1-1-1-1')
T M U 
1 2 3 

前面的4个随机的向量的交集可以有13种情况,各个情况的元素的数量都展现出来了,提取需要的组合,很简单的which函数即可:

也可以试试看UpSetR包

代码如下:

代码语言:javascript
复制
library(UpSetR) 
p=upset(fromList(VENN.LIST), order.by = "freq")
p
p$New_data

它得到 p$New_data 其实就是我们自己制作的 y

归根结底都是R基础知识的掌握而已。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先设置4个随机的向量
  • 然后绘制韦恩图
  • 可以制作csv表格
  • 或者代码提取元素
  • 也可以试试看UpSetR包
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档