yukiregista / ConsensusProj

MIT License
2 stars 0 forks source link

Plotの改善 #19

Closed yukiregista closed 6 months ago

yukiregista commented 7 months ago

今はBioPythonを使って書いているが,もう少しいいパッケージ等あるかも? また,図のサイズがちゃんと決まっていない(大きいツリーだと潰れる).

atsuhmd commented 7 months ago

ETE3と繋げる方法

ete3.PhyloTree(), ete3.Tree() ともに入力として受け取る際にnewickもしくはnewick形式のファイルが必要. 但し, dendropyのTree.as_string(shema='newick')でこれを与える場合, 先頭の '[&U]' でエラーを吐く(エラーコード参照). (これはete3のPhyloTree, Tree がともに根なし木を考慮していないから

一回 [&U]を削除してあげるとうまくいくが, 描画の際にはunrootにする処理をする(多分描画module TreeStyleでこれはできそう)

---------------------------------------------------------------------------
NewickError                               Traceback (most recent call last)
Cell In[21], line 1
----> 1 t = ete3.PhyloTree(string)

File ~/work/ConsensusProj/ConsensusProj/lib/python3.12/site-packages/ete3/phylo/phylotree.py:391, in PhyloNode.__init__(self, newick, alignment, alg_format, sp_naming_function, format, **kargs)
    388 self._speciesFunction = None
    389 # Caution! native __init__ has to be called after setting
    390 # _speciesFunction to None!!
--> 391 TreeNode.__init__(self, newick=newick, format=format, **kargs)
    393 # This will be only executed after reading the whole tree,
    394 # because the argument 'alignment' is not passed to the
    395 # PhyloNode constructor during parsing
    396 if alignment:

File ~/work/ConsensusProj/ConsensusProj/lib/python3.12/site-packages/ete3/coretype/tree.py:212, in TreeNode.__init__(self, newick, format, dist, support, name, quoted_node_names)
    210 if newick is not None:
    211     self._dist = 0.0
--> 212     read_newick(newick, root_node = self, format=format,
    213                 quoted_names=quoted_node_names)

File ~/work/ConsensusProj/ConsensusProj/lib/python3.12/site-packages/ete3/parser/newick.py:262, in read_newick(newick, root_node, format, quoted_names)
    259 nw = nw.strip()
    260 if not nw.startswith('(') and nw.endswith(';'):
    261     #return _read_node_data(nw[:-1], root_node, "single", matcher, format)
--> 262     return _read_newick_from_string(nw, root_node, matcher, format, quoted_names)
    263 elif not nw.startswith('(') or not nw.endswith(';'):
    264     raise NewickError('Unexisting tree file or Malformed newick tree structure.')

File ~/work/ConsensusProj/ConsensusProj/lib/python3.12/site-packages/ete3/parser/newick.py:290, in _read_newick_from_string(nw, root_node, matcher, formatcode, quoted_names)
    287     nw = unquoted_nw
    289 if not nw.startswith('(') and nw.endswith(';'):
--> 290     _read_node_data(nw[:-1], root_node, "single", matcher, format)
    291     if quoted_names:
    292         if root_node.name.startswith(_QUOTED_TEXT_PREFIX):

File ~/work/ConsensusProj/ConsensusProj/lib/python3.12/site-packages/ete3/parser/newick.py:445, in _read_node_data(subnw, current_node, node_type, matcher, formatcode)
    443         _parse_extra_features(node, data[2])
    444 else:
--> 445     raise NewickError("Unexpected newick format '%s' " %subnw[0:50])
    446 return

NewickError: Unexpected newick format '[&U] (S1,S2,(S3,((S7,S8,((S11,S12),(S9,S10)),(S4,S' 
You may want to check other newick loading flags like 'format' or 'quoted_node_names'.
Selection deleted
atsuhmd commented 7 months ago

メモ: ETE3で描画する際に pip install PyQt5をした

yukiregista commented 7 months ago

@atsuhmd 気付くのが遅れちゃいました&自分の例が悪かったんですが,as_string でnewickで書き下すときに suppress_rooting=True をつけてやる (e.g. t.as_string("newick", suppress_rooting=True)) と,最初の[&U]がなくなります!

atsuhmd commented 7 months ago

これ, [U&] を消す処理にしておいて後でunrootedを付加する処理にしておいた方がいいかなって思っていました(関数にunrootedであることを渡すために)

yukiregista commented 7 months ago

その場合newickじゃないファイルで書き出してもらうのがいいかもしれません(nexusとか)

atsuhmd commented 7 months ago

これ相当致命的なんですけど, ETE3はnewickしか受け取れないっぽいです

atsuhmd commented 7 months ago

ETE3を使うのは悪手のようなので, #20 でもあるような別のファイル読み込みができるもの(ggtreeとかかもしれない)をひとまず調べてみます.

yukiregista commented 7 months ago

それならETE3で[&U]なしで個人的には良いと思います!(rootedへのサポートはひとまずそれほど重要でないので)

atsuhmd commented 7 months ago

ひとまず進捗分pushしました.

描画はETE3に任せて, supportをbranch(正確には, ete3.Treeクラスのbranchにはsupportを1つしか割り当てられなかったためbranchの子側ノード)にsupportを複数個付け加えられるような関数 _visualize.get_support を作成しています.

example_notebook内のtest_drawで描けるようにしているので, こちらご参照ください.

yukiregista commented 6 months ago