利用Graphviz 可視化GO 數據庫


GO是一個同源蛋白的數據庫,按照三大類別BP(生物學過程), MF(分子功能), CC(細胞組分) 對基因的產物-蛋白質進行了分類;

在GO數據庫中,本質上是一個有向無環圖的數據結構,在三大類別之下,又有小的分類層級,一層一層的分類下去;

對於某個具體的GO號來說,代表了一組同源蛋白,擁有相似的結構和功能,在數據庫中,有上層分類的GO,也可能在這個GO下面,還有其他的GO

為了直觀的展示某個GO號的分類,利用數據庫提供的go-basic.obo 文件得到不同GO之間的層級關系,然后用Graphviz 進行可視化

首先下載go-basic.obo 文件, 到GO官網 http://geneontology.org/page/download-ontology

選擇下載go-basic.obo 文件

wget http://purl.obolibrary.org/obo/go/go-basic.obo

觀察obo 文件

[Term]
id: GO:0000001
name: mitochondrion inheritance
namespace: biological_process
def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interaction
synonym: "mitochondrial inheritance" EXACT []
is_a: GO:0048308 ! organelle inheritance
is_a: GO:0048311 ! mitochondrion distribution

其核心是Term , 每個Term 下記錄了一個具體的GO, name 是對該GO的簡單描述,namespace 是值該GO 屬於三大類別中的哪一個,def 是詳細的描述信息, is_a 記錄了該GO 對應的上層分類的GO

根據每個GO的is_a的信息,就可以得到所有GO之間的相互關系,利用程序處理,對於某個具體的GO,就可以得到其對應的所有上層分類,然后整理成Graphviz 識別的dot 文件,進行可視化

具體的代碼如下:

#!/usr/bin/env perl

my ($obo, $go) = @ARGV;

my %nodes = ();
my %edges = ();
local $/ = "[Term]";
open OBO, $obo or die "Can't open $obo!\n";
while (<OBO>) {
    chomp;
    my ($node) = $_ =~ /id:\s+(\S+)/;
    next if not defined $node;
    my ($name) = $_ =~ /name:\s+(.+?)\n/;    
    my $label = qq{"$node\\n$name"};
    $node =~ s/://;
    $nodes{$node} = $label;
    my @edge   = $_ =~ /is_a:\s+(GO:\d+)/;
    foreach my $x (@edge) {
        $x =~ s/://;
        push @{$edges{$node}}, $x;
    }    
}
close OBO;



my @val  = @{$edges{$go}};
my @node = ();
my @edge = ();

push @node, $go;
my $start = $go;
while (@val) {
    my $id = shift @val;
    push @node, $id;
    push @edge, qq{$id -> $start;};
    
    foreach my $x (@{$edges{$id}}) {
        push @val, $x;
    }
    $start = $id;
}


print qq{digraph go\{\n};

foreach my $x (@node) {
    print qq{$x\[label = $nodes{$x}\];\n};
}

foreach my $x (@edge) {
    print qq{$x\n};
}
print qq{\}};

運行的命令如下:

perl  parse_go.pl go-basic.obo GO0002485 > GO0002485.dot

 如果使用GO:0002485 這種作為結點的名字,Graphviz 不能夠正確識別,所以我把冒號統一替換掉了,生成的GO0002485的內容如下:

digraph go{
GO0002485[label = "GO:0002485\nantigen processing and presentation of endogenous peptide antigen via MHC class I via ER pathway, TAP-dependent"];
GO0002484[label = "GO:0002484\nantigen processing and presentation of endogenous peptide antigen via MHC class I via ER pathway"];
GO0019885[label = "GO:0019885\nantigen processing and presentation of endogenous peptide antigen via MHC class I"];
GO0002474[label = "GO:0002474\nantigen processing and presentation of peptide antigen via MHC class I"];
GO0048002[label = "GO:0048002\nantigen processing and presentation of peptide antigen"];
GO0019882[label = "GO:0019882\nantigen processing and presentation"];
GO0002376[label = "GO:0002376\nimmune system process"];
GO0008150[label = "GO:0008150\nbiological_process"];
GO0002484 -> GO0002485;
GO0019885 -> GO0002484;
GO0002474 -> GO0019885;
GO0048002 -> GO0002474;
GO0019882 -> GO0048002;
GO0002376 -> GO0019882;
GO0008150 -> GO0002376;
}

最后用Graphviz 進行可視化

dot -T pdf GO0002485.dot -o GO0002485.pdf

效果圖如下:

這里全部采用了默認的格式,其實還可以在這個基礎上再修改樣式,使圖片更加的美觀;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM