From e763ca5721d9c02d7ed7948e62299ae264076fce Mon Sep 17 00:00:00 2001 From: Fabio Zanini Date: Thu, 9 Oct 2025 19:27:43 +1100 Subject: [PATCH] Add paragraph about iplotx in Phylo tutorial (#5028) Add mention in NEWS.rst --- Doc/Tutorial/chapter_phylo.rst | 29 +++++++++++++++++++++++++++++ Doc/images/phylo-color-iplotx.png | Bin 0 -> 7354 bytes NEWS.rst | 5 +++++ 3 files changed, 34 insertions(+) create mode 100644 Doc/images/phylo-color-iplotx.png diff --git a/Doc/Tutorial/chapter_phylo.rst b/Doc/Tutorial/chapter_phylo.rst index e18b0fb20..882388302 100644 --- a/Doc/Tutorial/chapter_phylo.rst +++ b/Doc/Tutorial/chapter_phylo.rst @@ -240,6 +240,35 @@ well as its descendents. The common ancestor of E and F turns out to be just under the root, and with this coloring we can see exactly where the root of the tree is. +Drawing trees with iplotx +~~~~~~~~~~~~~~~~~~~~~~~~~ + +For users seeking advanced styling options, Bio.Phylo trees are natively +supported by the external library ``iplotx``: + +https://iplotx.readthedocs.io/en/latest/ + +``iplotx`` enables customisation of many aspects of the visualisation, +including layout, vertex and branch properties, cascading backgrounds, +and labels. Here is a self-contained example. + +.. code:: pycon + + >>> from Bio import Phylo + >>> import iplotx as ipx + >>> tree = Phylo.read("simple.dnd", "newick") + >>> ipx.tree(tree, leaf_deep=True, leaf_labels=True, style="tree") + +.. figure:: ../images/phylo-color-iplotx.png + :alt: A colorized tree drawn with ``iplotx.tree``. + :name: fig:phylo-color-iplotx + :width: 70.0% + +``iplotx`` has an extensive `gallery of examples `__. + +Writing tree to file +~~~~~~~~~~~~~~~~~~~~ + My, we’ve accomplished a lot! Let’s take a break here and save our work. Call the ``write`` function with a file name or handle — here we use standard output, to see what would be written — and the format diff --git a/Doc/images/phylo-color-iplotx.png b/Doc/images/phylo-color-iplotx.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4a2fa4960815dcb1c8150ff021755e43456d76 GIT binary patch literal 7354 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 i&rtoJca$5e0&lEdSy8&%^x