Drawing trees

If you have a tree in a file, you can draw it to your terminal by calling interactive p4 with the -d flag:

$ p4 -d myTreeFile.phy

You can draw a tree using interactive p4 or in a p4 script:

t = var.trees[0]

It also works with trees input as strings:

read("(A, B, (C, (D, E)));")
t = var.trees[0]
|        +---------4:C
         |         +--------6:D

The Tree.Tree.draw() method has a few args that you can adjust. One odd one is the addToBrLen arg, which is 0.2 by default. It adds that length to all branches in a text drawing to improve legibility. Its a feature, not a bug.

Drawing a tree with TV and BTV

If you have Tkinter installed you can use Tree.Tree.tv() to draw it on the screen. It uses the Python shell as the Tkinter event loop, so you need to use this interactively.

This method understands and displays taxon sets. For example, if you have a tree named t and you define and read in taxSets in a NEXUS sets block like this:


begin sets;
  taxSet outgroup = 1-4;
  taxSet ingroup = 5-20;
  taxSet ts1 = 1-10;
  taxSet ts2 = 11-20;

Then you can:


And then you can display the taxon sets that you have defined.


If your tree is very big, it will not display well in tv(). In that case, you can use Tree.Tree.btv() (Big Tree Viewer) to display it. This viewer has two panels – one showing the whole tree for navigation, and one showing a portion of the big tree. The default colours are random, but you can highlight taxon sets as for tv().


In the btv() example above, with 350 taxa, the right panel shows the whole tree. The red rectangle in the right panel acts as a viewport, and outlines the region of the tree that is shown in the left panel. You can move the red rectangle up and down with the keyboard arrow keys to change the viewport, or you can select a region with your mouse.

You should be able to go up to a few thousand taxa with btv(). But when trees get that big, I don’t think that a picture is going to be much help.

Comparing two trees with a GUI

Lets say that you have two similar trees (with the same taxa), that perhaps look very different because they are rooted in different places, and due to rotations of various internal nodes, but which may additionally have some real differences in topology. You can visualize those differences with the Tree.Tree.tvTopologyCompare() method. Robinson-Foulds differences between the trees are highlighted with red or orange lines for internal splits that differ, for example


Drawing radial phylograms

See TreeGram