From 22a0392f668d18784ce6b1b0bd6d65216ced2eea Mon Sep 17 00:00:00 2001 From: Yan Wong Date: Fri, 6 Jun 2025 14:27:19 +0100 Subject: [PATCH] Add an edge ID Only 3 lines in drawing.py, and a single test. The rest of the churn is the pre-saved SVGs, sorry --- python/CHANGELOG.rst | 3 + python/tests/data/svg/internal_sample_ts.svg | 84 +++++++------- python/tests/data/svg/tree.svg | 12 +- python/tests/data/svg/tree_both_axes.svg | 12 +- python/tests/data/svg/tree_muts.svg | 14 +-- python/tests/data/svg/tree_muts_all_edge.svg | 14 +-- python/tests/data/svg/tree_poly.svg | 82 ++++++------- python/tests/data/svg/tree_poly_tracked.svg | 30 ++--- .../data/svg/tree_poly_tracked_collapse.svg | 24 ++-- .../tests/data/svg/tree_simple_collapsed.svg | 12 +- python/tests/data/svg/tree_subtree.svg | 12 +- .../data/svg/tree_subtrees_with_collapsed.svg | 36 +++--- python/tests/data/svg/tree_timed_muts.svg | 14 +-- python/tests/data/svg/tree_x_axis.svg | 14 +-- python/tests/data/svg/tree_y_axis_rank.svg | 14 +-- python/tests/data/svg/ts.svg | 70 ++++++------ python/tests/data/svg/ts_max_trees.svg | 100 ++++++++-------- .../tests/data/svg/ts_max_trees_treewise.svg | 100 ++++++++-------- python/tests/data/svg/ts_multiroot.svg | 108 +++++++++--------- python/tests/data/svg/ts_mut_highlight.svg | 70 ++++++------ python/tests/data/svg/ts_mut_times.svg | 70 ++++++------ .../tests/data/svg/ts_mut_times_logscale.svg | 70 ++++++------ python/tests/data/svg/ts_mut_times_titles.svg | 70 ++++++------ .../tests/data/svg/ts_mutations_no_edges.svg | 20 ++-- .../data/svg/ts_mutations_timed_no_edges.svg | 20 ++-- python/tests/data/svg/ts_no_axes.svg | 70 ++++++------ python/tests/data/svg/ts_plain.svg | 70 ++++++------ python/tests/data/svg/ts_plain_no_xlab.svg | 70 ++++++------ python/tests/data/svg/ts_plain_y.svg | 70 ++++++------ python/tests/data/svg/ts_rank.svg | 70 ++++++------ python/tests/data/svg/ts_title.svg | 70 ++++++------ python/tests/data/svg/ts_x_lim.svg | 42 +++---- python/tests/data/svg/ts_xlabel.svg | 70 ++++++------ python/tests/data/svg/ts_y_axis.svg | 70 ++++++------ python/tests/data/svg/ts_y_axis_log.svg | 70 ++++++------ python/tests/data/svg/ts_y_axis_regular.svg | 70 ++++++------ python/tests/test_drawing.py | 23 ++-- python/tskit/drawing.py | 6 +- 38 files changed, 930 insertions(+), 916 deletions(-) diff --git a/python/CHANGELOG.rst b/python/CHANGELOG.rst index f59ae5e9c5..9fc257c9d9 100644 --- a/python/CHANGELOG.rst +++ b/python/CHANGELOG.rst @@ -7,6 +7,9 @@ - ``TreeSequence.map_to_vcf_model`` now also returns the transformed positions and contig length. (:user:`benjeffery`, :pr:`3174`, :issue:`3173`) +- ``draw_svg()`` methods now associate tree branches with edge IDs + (:user:`hyanwong`, :pr:`3193`, :issue:`557`) + **Bugfixes** - Fix bug in ``TreeSequence.pair_coalescence_counts`` when ``span_normalise=True`` diff --git a/python/tests/data/svg/internal_sample_ts.svg b/python/tests/data/svg/internal_sample_ts.svg index 58e9185b17..6ede5185bd 100644 --- a/python/tests/data/svg/internal_sample_ts.svg +++ b/python/tests/data/svg/internal_sample_ts.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -150,12 +150,12 @@ 9 - + 7 - + 8 @@ -166,16 +166,16 @@ - + 0 - + 1 - + @@ -191,12 +191,12 @@ - + 2 - + @@ -205,11 +205,11 @@ 3 - + 5 - + @@ -219,7 +219,7 @@ 7 - + 8 @@ -230,45 +230,45 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 - + 7 - + 8 @@ -279,27 +279,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -308,16 +308,16 @@ 3 - + 5 - + 7 - + 8 @@ -328,40 +328,40 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 - + 7 diff --git a/python/tests/data/svg/tree.svg b/python/tests/data/svg/tree.svg index 1eae56aa85..e79f418018 100644 --- a/python/tests/data/svg/tree.svg +++ b/python/tests/data/svg/tree.svg @@ -8,31 +8,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 diff --git a/python/tests/data/svg/tree_both_axes.svg b/python/tests/data/svg/tree_both_axes.svg index 863bdf09b8..d53912372f 100644 --- a/python/tests/data/svg/tree_both_axes.svg +++ b/python/tests/data/svg/tree_both_axes.svg @@ -62,31 +62,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 diff --git a/python/tests/data/svg/tree_muts.svg b/python/tests/data/svg/tree_muts.svg index 1651e84776..4c927ade8a 100644 --- a/python/tests/data/svg/tree_muts.svg +++ b/python/tests/data/svg/tree_muts.svg @@ -8,31 +8,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -41,7 +41,7 @@ 5 - + diff --git a/python/tests/data/svg/tree_muts_all_edge.svg b/python/tests/data/svg/tree_muts_all_edge.svg index a45bc96e7b..f80df52443 100644 --- a/python/tests/data/svg/tree_muts_all_edge.svg +++ b/python/tests/data/svg/tree_muts_all_edge.svg @@ -60,16 +60,16 @@ - + 0 - + 1 - + @@ -85,12 +85,12 @@ - + 2 - + @@ -104,11 +104,11 @@ 3 - + 5 - + diff --git a/python/tests/data/svg/tree_poly.svg b/python/tests/data/svg/tree_poly.svg index f1997c8b5b..af2eefd717 100644 --- a/python/tests/data/svg/tree_poly.svg +++ b/python/tests/data/svg/tree_poly.svg @@ -8,206 +8,206 @@ - + 0 - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 30 - + 31 - + 7 - + 8 - + 9 - + 10 - + 11 - + 12 - + 13 - + 32 - + 33 - + 14 - + 15 - + 16 - + 17 - + 18 - + 19 - + 20 - + 34 - + 35 - + 21 - + 22 - + 36 - + 23 - + 24 - + 37 - + 25 - + 26 - + 38 - + 27 - + 28 - + 29 - + 39 - + 40 diff --git a/python/tests/data/svg/tree_poly_tracked.svg b/python/tests/data/svg/tree_poly_tracked.svg index fdf6b8712c..69563b56d8 100644 --- a/python/tests/data/svg/tree_poly_tracked.svg +++ b/python/tests/data/svg/tree_poly_tracked.svg @@ -9,7 +9,7 @@ - + 20 @@ -20,7 +20,7 @@ This polytomy has 3 additional branches, leading to a total of 3 descendant samples - + 34 @@ -31,13 +31,13 @@ This polytomy has 3 additional branches, leading to a total of 3 descendant samples - + 35 - + @@ -48,55 +48,55 @@ - + 23 - + 24 - + 37 - + 25 - + 26 - + 38 - + 27 - + 28 - + 29 - + 39 - + 40 diff --git a/python/tests/data/svg/tree_poly_tracked_collapse.svg b/python/tests/data/svg/tree_poly_tracked_collapse.svg index 895daa2ac1..1e2e170187 100644 --- a/python/tests/data/svg/tree_poly_tracked_collapse.svg +++ b/python/tests/data/svg/tree_poly_tracked_collapse.svg @@ -9,7 +9,7 @@ - + 20 @@ -20,7 +20,7 @@ This polytomy has 3 additional branches, leading to a total of 3 descendant samples - + 34 @@ -31,13 +31,13 @@ This polytomy has 3 additional branches, leading to a total of 3 descendant samples - + 35 - + @@ -48,36 +48,36 @@ - + 23 - + 24 - + 37 - + 25 - + 26 - + 38 - + @@ -86,7 +86,7 @@ 39 - + 40 diff --git a/python/tests/data/svg/tree_simple_collapsed.svg b/python/tests/data/svg/tree_simple_collapsed.svg index 7bc5d31f7f..4928838fdc 100644 --- a/python/tests/data/svg/tree_simple_collapsed.svg +++ b/python/tests/data/svg/tree_simple_collapsed.svg @@ -8,7 +8,7 @@ - + @@ -19,25 +19,25 @@ - + 2 - + 3 - + 9 - + 10 - + diff --git a/python/tests/data/svg/tree_subtree.svg b/python/tests/data/svg/tree_subtree.svg index 593b7a1c64..ae41bd36dc 100644 --- a/python/tests/data/svg/tree_subtree.svg +++ b/python/tests/data/svg/tree_subtree.svg @@ -8,31 +8,31 @@ - + 0 - + 1 - + 8 - + 2 - + 3 - + 9 diff --git a/python/tests/data/svg/tree_subtrees_with_collapsed.svg b/python/tests/data/svg/tree_subtrees_with_collapsed.svg index afcae706b7..3a7415c990 100644 --- a/python/tests/data/svg/tree_subtrees_with_collapsed.svg +++ b/python/tests/data/svg/tree_subtrees_with_collapsed.svg @@ -8,7 +8,7 @@ - + @@ -19,55 +19,55 @@ - + 2 - + 3 - + 17 - + 18 - + 4 - + 5 - + 19 - + 6 - + 7 - + 20 - + 21 @@ -77,31 +77,31 @@ - + 8 - + 9 - + 23 - + 10 - + 11 - + 24 diff --git a/python/tests/data/svg/tree_timed_muts.svg b/python/tests/data/svg/tree_timed_muts.svg index ca187728ca..c13440881a 100644 --- a/python/tests/data/svg/tree_timed_muts.svg +++ b/python/tests/data/svg/tree_timed_muts.svg @@ -8,31 +8,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -41,7 +41,7 @@ 5 - + diff --git a/python/tests/data/svg/tree_x_axis.svg b/python/tests/data/svg/tree_x_axis.svg index 3c4f2e7bd1..50aa686040 100644 --- a/python/tests/data/svg/tree_x_axis.svg +++ b/python/tests/data/svg/tree_x_axis.svg @@ -51,16 +51,16 @@ - + 0 - + 1 - + @@ -76,12 +76,12 @@ - + 2 - + @@ -90,11 +90,11 @@ 3 - + 5 - + diff --git a/python/tests/data/svg/tree_y_axis_rank.svg b/python/tests/data/svg/tree_y_axis_rank.svg index 79af1d5072..b6b31e7946 100644 --- a/python/tests/data/svg/tree_y_axis_rank.svg +++ b/python/tests/data/svg/tree_y_axis_rank.svg @@ -46,16 +46,16 @@ - + 0 - + 1 - + @@ -71,12 +71,12 @@ - + 2 - + @@ -85,11 +85,11 @@ 3 - + 5 - + diff --git a/python/tests/data/svg/ts.svg b/python/tests/data/svg/ts.svg index 0323aa1c99..ceeef8cbda 100644 --- a/python/tests/data/svg/ts.svg +++ b/python/tests/data/svg/ts.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -156,16 +156,16 @@ - + 0 - + 1 - + @@ -181,12 +181,12 @@ - + 2 - + @@ -195,11 +195,11 @@ 3 - + 5 - + @@ -215,35 +215,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -254,27 +254,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -283,11 +283,11 @@ 3 - + 5 - + 7 @@ -298,35 +298,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_max_trees.svg b/python/tests/data/svg/ts_max_trees.svg index a012e7e778..1b47dee35d 100644 --- a/python/tests/data/svg/ts_max_trees.svg +++ b/python/tests/data/svg/ts_max_trees.svg @@ -140,51 +140,51 @@ - + 1 - + 4 - + 5 - + 7 - + 11 - + 0 - + 2 - + 3 - + 8 - + 16 @@ -198,51 +198,51 @@ - + 1 - + 4 - + 5 - + 7 - + 11 - + 0 - + 2 - + 3 - + 8 - + 16 @@ -256,47 +256,47 @@ - + 1 - + 4 - + 5 - + 7 - + 11 - + 0 - + 2 - + 3 - + @@ -305,7 +305,7 @@ 8 - + 16 @@ -329,24 +329,24 @@ - + 0 - + 5 - + 1 - + @@ -355,30 +355,30 @@ 4 - + 6 - + 7 - + 10 - + 2 - + 3 - + 15 @@ -392,36 +392,36 @@ - + 0 - + 5 - + 1 - + 4 - + 6 - + 7 - + @@ -432,16 +432,16 @@ - + 2 - + 3 - + 15 diff --git a/python/tests/data/svg/ts_max_trees_treewise.svg b/python/tests/data/svg/ts_max_trees_treewise.svg index f088c89e68..f3cadfd67f 100644 --- a/python/tests/data/svg/ts_max_trees_treewise.svg +++ b/python/tests/data/svg/ts_max_trees_treewise.svg @@ -114,51 +114,51 @@ - + 1 - + 4 - + 5 - + 7 - + 11 - + 0 - + 2 - + 3 - + 8 - + 16 @@ -172,51 +172,51 @@ - + 1 - + 4 - + 5 - + 7 - + 11 - + 0 - + 2 - + 3 - + 8 - + 16 @@ -230,47 +230,47 @@ - + 1 - + 4 - + 5 - + 7 - + 11 - + 0 - + 2 - + 3 - + @@ -279,7 +279,7 @@ 8 - + 16 @@ -303,24 +303,24 @@ - + 0 - + 5 - + 1 - + @@ -329,30 +329,30 @@ 4 - + 6 - + 7 - + 10 - + 2 - + 3 - + 15 @@ -366,36 +366,36 @@ - + 0 - + 5 - + 1 - + 4 - + 6 - + 7 - + @@ -406,16 +406,16 @@ - + 2 - + 3 - + 15 diff --git a/python/tests/data/svg/ts_multiroot.svg b/python/tests/data/svg/ts_multiroot.svg index 9d2637d45a..c4ffeea709 100644 --- a/python/tests/data/svg/ts_multiroot.svg +++ b/python/tests/data/svg/ts_multiroot.svg @@ -198,7 +198,7 @@ - + @@ -208,16 +208,16 @@ 2 - + 4 - + 5 - + @@ -233,16 +233,16 @@ - + 1 - + 3 - + 11 @@ -255,7 +255,7 @@ - + @@ -266,16 +266,16 @@ - + 1 - + 3 - + 11 @@ -284,17 +284,17 @@ - + 2 - + 4 - + 5 @@ -312,17 +312,17 @@ - + 2 - + 4 - + @@ -331,22 +331,22 @@ 5 - + 6 - + 1 - + 3 - + 11 @@ -364,36 +364,36 @@ - + 2 - + 4 - + 5 - + 6 - + 1 - + 3 - + 7 @@ -406,7 +406,7 @@ - + @@ -417,7 +417,7 @@ - + @@ -428,20 +428,20 @@ - + 2 - + 4 - + 6 - + 10 @@ -450,12 +450,12 @@ - + 1 - + 3 @@ -468,12 +468,12 @@ - + 0 - + 5 @@ -482,12 +482,12 @@ - + 1 - + 3 @@ -496,12 +496,12 @@ - + 2 - + 4 @@ -514,7 +514,7 @@ - + @@ -524,7 +524,7 @@ 0 - + 5 @@ -537,12 +537,12 @@ - + 2 - + @@ -552,7 +552,7 @@ 4 - + 3 @@ -565,22 +565,22 @@ - + 1 - + 0 - + 5 - + 8 @@ -589,7 +589,7 @@ - + @@ -599,12 +599,12 @@ 2 - + 4 - + 3 diff --git a/python/tests/data/svg/ts_mut_highlight.svg b/python/tests/data/svg/ts_mut_highlight.svg index 72c9fda2d8..0afc4d199f 100644 --- a/python/tests/data/svg/ts_mut_highlight.svg +++ b/python/tests/data/svg/ts_mut_highlight.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -156,16 +156,16 @@ - + 0 - + 1 - + @@ -181,12 +181,12 @@ - + 2 - + @@ -195,11 +195,11 @@ 3 - + 5 - + @@ -215,35 +215,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -254,27 +254,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -283,11 +283,11 @@ 3 - + 5 - + 7 @@ -298,35 +298,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_mut_times.svg b/python/tests/data/svg/ts_mut_times.svg index 6f4955ec03..6e1f097a84 100644 --- a/python/tests/data/svg/ts_mut_times.svg +++ b/python/tests/data/svg/ts_mut_times.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -156,16 +156,16 @@ - + 0 - + 1 - + @@ -181,12 +181,12 @@ - + 2 - + @@ -195,11 +195,11 @@ 3 - + 5 - + @@ -215,35 +215,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -254,27 +254,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -283,11 +283,11 @@ 3 - + 5 - + 7 @@ -298,35 +298,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_mut_times_logscale.svg b/python/tests/data/svg/ts_mut_times_logscale.svg index 4ba7e1a005..57f597beef 100644 --- a/python/tests/data/svg/ts_mut_times_logscale.svg +++ b/python/tests/data/svg/ts_mut_times_logscale.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -156,16 +156,16 @@ - + 0 - + 1 - + @@ -181,12 +181,12 @@ - + 2 - + @@ -195,11 +195,11 @@ 3 - + 5 - + @@ -215,35 +215,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -254,27 +254,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -283,11 +283,11 @@ 3 - + 5 - + 7 @@ -298,35 +298,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_mut_times_titles.svg b/python/tests/data/svg/ts_mut_times_titles.svg index 5a76bff164..1d6873118b 100644 --- a/python/tests/data/svg/ts_mut_times_titles.svg +++ b/python/tests/data/svg/ts_mut_times_titles.svg @@ -118,20 +118,20 @@ - + NoDe0! 0 - + NoDe1! 1 - + NoDe4! @@ -139,20 +139,20 @@ - + NoDe2! 2 - + NoDe3! 3 - + @@ -165,7 +165,7 @@ 5 - + @@ -192,20 +192,20 @@ - + NoDe0! 0 - + NoDe1! 1 - + @@ -227,14 +227,14 @@ - + NoDe2! 2 - + @@ -247,13 +247,13 @@ 3 - + NoDe5! 5 - + @@ -273,20 +273,20 @@ - + NoDe0! 0 - + NoDe1! 1 - + NoDe4! @@ -294,26 +294,26 @@ - + NoDe2! 2 - + NoDe3! 3 - + NoDe5! 5 - + NoDe6! @@ -326,20 +326,20 @@ - + NoDe0! 0 - + NoDe1! 1 - + NoDe4! @@ -347,14 +347,14 @@ - + NoDe2! 2 - + @@ -367,13 +367,13 @@ 3 - + NoDe5! 5 - + NoDe7! @@ -386,20 +386,20 @@ - + NoDe0! 0 - + NoDe1! 1 - + NoDe4! @@ -407,26 +407,26 @@ - + NoDe2! 2 - + NoDe3! 3 - + NoDe5! 5 - + NoDe8! diff --git a/python/tests/data/svg/ts_mutations_no_edges.svg b/python/tests/data/svg/ts_mutations_no_edges.svg index 7d0f4171f5..f85a652cf5 100644 --- a/python/tests/data/svg/ts_mutations_no_edges.svg +++ b/python/tests/data/svg/ts_mutations_no_edges.svg @@ -57,32 +57,32 @@ - + 0 - + 1 - + 2 - + 3 - + 4 - + @@ -92,12 +92,12 @@ 5 - + 6 - + @@ -107,12 +107,12 @@ 7 - + 8 - + 9 diff --git a/python/tests/data/svg/ts_mutations_timed_no_edges.svg b/python/tests/data/svg/ts_mutations_timed_no_edges.svg index c4f5dfa42b..f7b70eb646 100644 --- a/python/tests/data/svg/ts_mutations_timed_no_edges.svg +++ b/python/tests/data/svg/ts_mutations_timed_no_edges.svg @@ -57,32 +57,32 @@ - + 0 - + 1 - + 2 - + 3 - + 4 - + @@ -92,12 +92,12 @@ 5 - + 6 - + @@ -107,12 +107,12 @@ 7 - + 8 - + 9 diff --git a/python/tests/data/svg/ts_no_axes.svg b/python/tests/data/svg/ts_no_axes.svg index d1674bb7cc..7539ef9054 100644 --- a/python/tests/data/svg/ts_no_axes.svg +++ b/python/tests/data/svg/ts_no_axes.svg @@ -10,31 +10,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -43,7 +43,7 @@ 5 - + @@ -64,16 +64,16 @@ - + 0 - + 1 - + @@ -89,12 +89,12 @@ - + 2 - + @@ -103,11 +103,11 @@ 3 - + 5 - + @@ -123,35 +123,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -162,27 +162,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -191,11 +191,11 @@ 3 - + 5 - + 7 @@ -206,35 +206,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_plain.svg b/python/tests/data/svg/ts_plain.svg index eab1a91be1..4e752e291f 100644 --- a/python/tests/data/svg/ts_plain.svg +++ b/python/tests/data/svg/ts_plain.svg @@ -56,31 +56,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -89,7 +89,7 @@ 5 - + @@ -110,16 +110,16 @@ - + 0 - + 1 - + @@ -135,12 +135,12 @@ - + 2 - + @@ -149,11 +149,11 @@ 3 - + 5 - + @@ -169,35 +169,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -208,27 +208,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -237,11 +237,11 @@ 3 - + 5 - + 7 @@ -252,35 +252,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_plain_no_xlab.svg b/python/tests/data/svg/ts_plain_no_xlab.svg index c17c1fb425..2a339f00a6 100644 --- a/python/tests/data/svg/ts_plain_no_xlab.svg +++ b/python/tests/data/svg/ts_plain_no_xlab.svg @@ -53,31 +53,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -86,7 +86,7 @@ 5 - + @@ -107,16 +107,16 @@ - + 0 - + 1 - + @@ -132,12 +132,12 @@ - + 2 - + @@ -146,11 +146,11 @@ 3 - + 5 - + @@ -166,35 +166,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -205,27 +205,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -234,11 +234,11 @@ 3 - + 5 - + 7 @@ -249,35 +249,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_plain_y.svg b/python/tests/data/svg/ts_plain_y.svg index 95c591307f..ca9ccd0eb3 100644 --- a/python/tests/data/svg/ts_plain_y.svg +++ b/python/tests/data/svg/ts_plain_y.svg @@ -85,31 +85,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -118,7 +118,7 @@ 5 - + @@ -139,16 +139,16 @@ - + 0 - + 1 - + @@ -164,12 +164,12 @@ - + 2 - + @@ -178,11 +178,11 @@ 3 - + 5 - + @@ -198,35 +198,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -237,27 +237,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -266,11 +266,11 @@ 3 - + 5 - + 7 @@ -281,35 +281,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_rank.svg b/python/tests/data/svg/ts_rank.svg index b507842dbc..94bf920f2e 100644 --- a/python/tests/data/svg/ts_rank.svg +++ b/python/tests/data/svg/ts_rank.svg @@ -152,31 +152,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -185,7 +185,7 @@ 5 - + @@ -206,16 +206,16 @@ - + 0 - + 1 - + @@ -231,12 +231,12 @@ - + 2 - + @@ -245,11 +245,11 @@ 3 - + 5 - + @@ -265,35 +265,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -304,27 +304,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -333,11 +333,11 @@ 3 - + 5 - + 7 @@ -348,35 +348,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_title.svg b/python/tests/data/svg/ts_title.svg index 49956b21f3..7135939a83 100644 --- a/python/tests/data/svg/ts_title.svg +++ b/python/tests/data/svg/ts_title.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -156,16 +156,16 @@ - + 0 - + 1 - + @@ -181,12 +181,12 @@ - + 2 - + @@ -195,11 +195,11 @@ 3 - + 5 - + @@ -215,35 +215,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -254,27 +254,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -283,11 +283,11 @@ 3 - + 5 - + 7 @@ -298,35 +298,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_x_lim.svg b/python/tests/data/svg/ts_x_lim.svg index 5a8256ec64..54c428eb91 100644 --- a/python/tests/data/svg/ts_x_lim.svg +++ b/python/tests/data/svg/ts_x_lim.svg @@ -58,35 +58,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 9 @@ -97,16 +97,16 @@ - + 0 - + 1 - + @@ -122,12 +122,12 @@ - + 2 - + @@ -136,11 +136,11 @@ 3 - + 5 - + @@ -156,35 +156,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 diff --git a/python/tests/data/svg/ts_xlabel.svg b/python/tests/data/svg/ts_xlabel.svg index f786ee3682..db033b5bea 100644 --- a/python/tests/data/svg/ts_xlabel.svg +++ b/python/tests/data/svg/ts_xlabel.svg @@ -102,31 +102,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -135,7 +135,7 @@ 5 - + @@ -156,16 +156,16 @@ - + 0 - + 1 - + @@ -181,12 +181,12 @@ - + 2 - + @@ -195,11 +195,11 @@ 3 - + 5 - + @@ -215,35 +215,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -254,27 +254,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -283,11 +283,11 @@ 3 - + 5 - + 7 @@ -298,35 +298,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_y_axis.svg b/python/tests/data/svg/ts_y_axis.svg index d590fef37a..3750b54150 100644 --- a/python/tests/data/svg/ts_y_axis.svg +++ b/python/tests/data/svg/ts_y_axis.svg @@ -152,31 +152,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -185,7 +185,7 @@ 5 - + @@ -206,16 +206,16 @@ - + 0 - + 1 - + @@ -231,12 +231,12 @@ - + 2 - + @@ -245,11 +245,11 @@ 3 - + 5 - + @@ -265,35 +265,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -304,27 +304,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -333,11 +333,11 @@ 3 - + 5 - + 7 @@ -348,35 +348,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_y_axis_log.svg b/python/tests/data/svg/ts_y_axis_log.svg index e1e5814fcf..54a1c47864 100644 --- a/python/tests/data/svg/ts_y_axis_log.svg +++ b/python/tests/data/svg/ts_y_axis_log.svg @@ -152,31 +152,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -185,7 +185,7 @@ 5 - + @@ -206,16 +206,16 @@ - + 0 - + 1 - + @@ -231,12 +231,12 @@ - + 2 - + @@ -245,11 +245,11 @@ 3 - + 5 - + @@ -265,35 +265,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -304,27 +304,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -333,11 +333,11 @@ 3 - + 5 - + 7 @@ -348,35 +348,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/data/svg/ts_y_axis_regular.svg b/python/tests/data/svg/ts_y_axis_regular.svg index 1ee704a096..40931a2b2c 100644 --- a/python/tests/data/svg/ts_y_axis_regular.svg +++ b/python/tests/data/svg/ts_y_axis_regular.svg @@ -180,31 +180,31 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + @@ -213,7 +213,7 @@ 5 - + @@ -234,16 +234,16 @@ - + 0 - + 1 - + @@ -259,12 +259,12 @@ - + 2 - + @@ -273,11 +273,11 @@ 3 - + 5 - + @@ -293,35 +293,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 6 @@ -332,27 +332,27 @@ - + 0 - + 1 - + 4 - + 2 - + @@ -361,11 +361,11 @@ 3 - + 5 - + 7 @@ -376,35 +376,35 @@ - + 0 - + 1 - + 4 - + 2 - + 3 - + 5 - + 8 diff --git a/python/tests/test_drawing.py b/python/tests/test_drawing.py index 94253e4695..3be8ab4823 100644 --- a/python/tests/test_drawing.py +++ b/python/tests/test_drawing.py @@ -2281,11 +2281,11 @@ def test_no_edges_show_empty(self): svg = ts.draw_svg(time_scale=time_scale, x_lim=[0, ts.sequence_length]) self.verify_basic_svg(svg) assert svg.count(" should be the root branch, if it exists - edge_str = ' 0 diff --git a/python/tskit/drawing.py b/python/tskit/drawing.py index 2fe73fe693..10386167bb 100644 --- a/python/tskit/drawing.py +++ b/python/tskit/drawing.py @@ -2137,6 +2137,7 @@ def draw_tree(self): tree = self.tree left_child = get_left_child(tree, self.postorder_nodes) parent_array = tree.parent_array + edge_array = tree.edge_array node_info = {} roots = [] # Roots of the displated tree @@ -2224,7 +2225,10 @@ def draw_tree(self): dx, dy = 0, -root_branch_l draw_edge_above_node = True if draw_edge_above_node: - add_class(self.edge_attrs[u], "edge") + edge_id_class = ( + "root" if edge_array[u] == tskit.NULL else f"e{edge_array[u]}" + ) + add_class(self.edge_attrs[u], f"edge {edge_id_class}") path = dwg.path( [("M", o), ("V", rnd(dy)), ("H", rnd(dx))], **self.edge_attrs[u] )