Skip to content

Biopython Phylo #
Find similar titles

You are seeing an old version of the page. Go to latest version

Bio.Phylo #

phylogentics #

Bio.Phylo 모듈은 SeqIO, AlignIO모듈을 이용하여 분석이 끝난 파일을 활용하여 계통 분석을 돕기 위한 기능들을 담고 있다.

(((A,B),(C,D)),(E,F,G));

[ClustalW] 프로그램을 이용해 생성되는 dnd 파일이 생성된다. 파일을 열어 보면 newick format 이라고 불리우는 위의 형태처럼 데이터가 담겨 있다. 여기에는 브랜치 길이가 없고 단지 라벨과 그룹핑만 되어 있다. 이를 통해 트리를 그려볼려면 다음과 같이 작성하면 된다. 사용법은 늘 그러하듯 from Bio import Phylo 클래스를 호출하면 된다. 그 후 Phylo.read("파일이름", "파일포맷형태") 로 읽어주고 출력하면 끝난다. 여기서 파일 포맷은 위에서 언급했듯이 newick포맷이다. 여기서 print를 해보면 간력한 정보를 확인할 수 있다.

>>> 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')

물론 트리를 그림 형태로 볼 수 있다. 실제 이미지를 생성하는 것은 아니지만 텍스트를 이용하여 그림처럼 보여준다. 이를 위해서 draw_ascii()를 통해서 그 대략정보를 윤곽을 확인할 수 있다.

>>> from Bio import Phylo
>>> tree = Phylo.read("simple.dnd", "newick")
>>> Phylo.draw_ascii(tree)
                                                    ________________________ A
                           ________________________|
                          |                        |________________________ B
  ________________________|
 |                        |                         ________________________ C
 |                        |________________________|
_|                                                 |________________________ D
 |
 |                         ________________________ E
 |                        |
 |________________________|________________________ F
                          |
                          |________________________ G
<BLANKLINE>

아래의 예제에서는 실제 그림을 통해 확인하는 예제이다. draw()를 이용하면 실제 데이터를 분석하여 이미지로 변환하고 그 이미지를 볼 수 있다(이미지 뷰어를 통해서)

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

Image

coloring #

보이는 부분이 좀 밋밋해 보인다면 컬러를 지정해 줄 수 있다. 이를 위해서는 트리를 XML 형태로 만들어야 하는데 이를 위한 모듈이 존재한다. Bio.Phylo.PhyloXML이 바로 그것인데 그중 그림을 그리기 위한 Phylogeny 가 있다. 이를 통해 다시 트리를 만든다. 예제는 다음과 같다.

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

그 후 트리에 컬러를 지정할 수 있는데 방법은 아래에서 보는 것처럼 세가지가 있다. RGB 값을 입력할 수도, HTML형태, 혹은 그냥 이미 정의된 색의 명칭을 넣어줘도 된다. 그 결과는 모두 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를 호출하고, read()를 이용하면 된다. 인자로는 파일경로, 포맷이다. 보통 확장자가 nwk라고 하는 부분 newick 포맷이라는 말이다. 그 후 트리를 출력하면 원하는 결과를 얻을 수 있다.

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

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

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


>>> trees = list(Phylo.parse("../../Tests/PhyloXML/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
0.0.1_20210630_7_v33