Skip to content

Biopython Phylo #
Find similar titles

Structured data

Category
Programming

Bio.Phylo #

phylogentics #

Bio.Phylo는 Biopython의 모듈 중 하나로 계통분석을 하기위한 기능들이 구성되었다. 이 모듈은 Biopython/SeqIO, Biopython/AlignIO를 이용하여 분석한 파일을 이용하여 계통분석을 할 수 있다.

[ClustalW] 프로그램을 이용하면 .aln, .dnd 파일이 생성된다. 파일을 열어 보면 newick format 이라고 불리우는 아래와 같은 형태의 데이터가 담겨 있다.

# newick format 예
(((A,B),(C,D)),(E,F,G));

여기에는 브랜치(branch)의 길이정보가 없고 라벨과 그룹핑정보만 있다. 이 파일을 이용하여 phylogenetic tree를 그리기 위해서는 아래 코드와 같이 작성하면 된다.

>>> from Bio import Phylo
>>> tree = Phylo.read("simple.dnd", "newick")
>>> print(tree)
Tree(rooted=False, weight=1.0)
    Clade()
        Clade()
            Clade()
                Clade(name='A')
                Clade(name='B')
            Clade()
                Clade(name='C')
                Clade(name='D')
        Clade()
            Clade(name='E')
            Clade(name='F')
            Clade(name='G')

from Bio import Phylo 클래스를 호출하고 Phylo.read("파일이름", "파일포맷형태") 로 읽어주고 출력한다. 여기서 Phylo.read()로 읽어오는 파일이 newick 포맷파일 이다. print 해보면 간략한 정보를 확인할 수 있다.

트리를 아래와 같이 출력할 수도 있다. 실제 이미지를 생성하는 것은 아니지만 텍스트를 이용하여 그림처럼 보여준다. 이를 위해서 draw_ascii()를 이용해서 그 대략적인 윤곽을 확인할 수 있다.

>>> from Bio import Phylo
>>> tree = Phylo.read("simple.dnd", "newick")
>>> Phylo.draw_ascii(tree)
                                ___________A
                 ______________|
                |              |___________B
  ______________|
 |              |               ___________C
 |              |_____________ |
_|                             |___________D
 |
 |               __________________________E
 |              |
 |______________|__________________________F
                |
                |__________________________G

이미지 파일로 트리를 그리는 방법은 아래와 같다. Phylo.draw()를 이용하면 실제 데이터를 분석하여 이미지로 변환하고 그 이미지를 볼 수 있다 (이미지 뷰어를 통해서)

>>> tree.rooted = True
>>> Phylo.draw(tree)

생성된 트리이미지는 다음과 같다.

Image

coloring #

보이는 부분이 좀 밋밋해 보인다면 컬러를 지정해 줄 수 있다. 이를 위해서는 트리를 XML 포맷으로 만들어야 하는데 이를 위한 Biopython 모듈이 존재한다. Biopython/Bio.Phylo.PhyloXML이 바로 그것인데, 그중 그림을 그리기 위한 Phylogeny를 사용하면 된다. 예제는 다음과 같다.

>>> from Bio.Phylo.PhyloXML import Phylogeny
>>> tree = Phylogeny.from_tree(tree)

그 후 트리에 컬러를 지정할 수 있는데 방법은 세 가지가 있다.

  1. RGB 값을 직접입력하는 것
  2. HTML 컬러코드를 이용하는 것
  3. 정의된 색의 명칭을 이용한는 것

아래 결과는 모두 gray 색으로 같다.

>>> tree.root.color = (128, 128, 128)
>>> tree.root.color = "#808080"
>>> tree.root.color = "gray"

각 노드, 즉 가지에서도 컬러를 지정할 수 있다.. 여기에서는 MRCA(the most recent common ancestor)를 정한다. 예제에서는 E, F를 가진 노드를 찾아서 mrca로 지정한다. 관련 함수는 common_ancestor()이다. 이 안에 찾고자 하는 노드의 라벨명을 사전 형태의 리스트로 넣어주면 된다. 그 후 컬러를 지정해주면 된다.

>>> mrca = tree.common_ancestor({"name": "E"}, {"name": "F"})
>>> mrca.color = "salmon"

다음으로는 각 노드(clade)의 위치를 정확하게 알고 있다면 직접 입력해줘도 된다. 여기서는 인덱스 값을 사용한다. 아래 예제에서는 root를 기준으로 첫 번째와 두 번째를 지정하는 것이다.

>>> tree.clade[0, 1].color = "blue"
>>> Phylo.draw(tree)

그 후 트리를 그리면 된다. 이 후 수정이 된 내용은 저장되지 않기 때문에 별도로 저장해줘야 한다. 먼저 트리의 표준 출력을 이용하여 저장한다. write() 메서드를 이용하여 트리객체, 출력, 파일포맷의 세 인수를 넘겨주는데 포맷의 형태는 phyloxml로 지정해주면 된다.

>>> import sys
>>> Phylo.write(tree, sys.stdout, "phyloxml")

<phy:phyloxml xmlns:phy="http://www.phyloxml.org">
  <phy:phylogeny rooted="true">
    <phy:clade>
      <phy:branch_length>1.0</phy:branch_length>
      <phy:color>
        <phy:red>128</phy:red>
        <phy:green>128</phy:green>
        <phy:blue>128</phy:blue>
      </phy:color>
      <phy:clade>
        <phy:branch_length>1.0</phy:branch_length>
        <phy:clade>
          <phy:branch_length>1.0</phy:branch_length>
          <phy:clade>
            <phy:name>A</phy:name>
            ...

I/O Function #

먼저 트리 파일을 읽어보자. from Bio import Phylo를 호출하고, Phylo.read()메서드를 이용하면 된다. 인자로는 파일경로, 포맷이다. 보통 확장자가 nwk라고 하는 부분은 newick 포맷이라는 말이다. 그 후 트리를 출력하면 원하는 결과를 얻을 수 있다.

>>> from Bio import Phylo
>>> tree = Phylo.read("Tests/Nexus/int_node_labels.nwk", "newick")
>>> print(tree)

다음의 예제에서는 phyloxml 형태의 파일을 읽어 볼 수 있다.

>> trees = Phylo.parse("phyloxml_examples.xml", "phyloxml")
>>> for tree in trees:
...     print(tree)


>>> trees = list(Phylo.parse("phyloxml_examples.xml", "phyloxml"))
>>> tree1 = trees[0]
>>> others = trees[1:]
>>> Phylo.write(tree1, "tree1.nwk", "newick")
1
>>> Phylo.write(others, "other_trees.nwk", "newick")
12

또한 다음과 같이 convert() 메서드를 이용하여 데이터 간 포맷을 변경하여 저장할 수 있다. 사용법은 (원본파일, 포맷, 변경파일, 포맷)의 형태로 써 주면 된다.

>>> Phylo.convert("tree1.nwk", "newick", "tree1.xml", "nexml")
1
>>> Phylo.convert("other_trees.xml", "phyloxml", "other_trees.nex", "nexus")
12

Suggested Pages #

0.0.1_20140628_0