Skip to content

Commit e179edc

Browse files
committed
Rename tree height to time
1 parent cf38edb commit e179edc

File tree

6 files changed

+246
-148
lines changed

6 files changed

+246
-148
lines changed

docs/examples.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ def write_table(tree):
312312

313313
write_table(tree)
314314
print(tree.draw_text())
315-
tree.draw_svg("_static/tree_structure1.svg", tree_height_scale="rank")
315+
tree.draw_svg("_static/tree_structure1.svg", time_scale="rank")
316316

317317
edges = """\
318318
left right parent child
@@ -327,7 +327,7 @@ def write_table(tree):
327327

328328
write_table(tree)
329329
print(tree.draw_text())
330-
tree.draw_svg("_static/tree_structure2.svg", tree_height_scale="rank")
330+
tree.draw_svg("_static/tree_structure2.svg", time_scale="rank")
331331

332332

333333
def tree_traversal():
@@ -396,7 +396,7 @@ def finding_nearest_neighbors():
396396
)
397397

398398
tree = ts.first()
399-
tree.draw_svg("_static/different_time_samples.svg", tree_height_scale="rank")
399+
tree.draw_svg("_static/different_time_samples.svg", time_scale="rank")
400400

401401

402402
# moving_along_tree_sequence()

python/CHANGELOG.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
- Add ``Table.assert_equals`` and ``TableCollection.assert_equals`` which give an exact
3535
report of any differences. (:user:`benjeffery`,:issue:`1076`, :pr:`1328`)
3636

37+
**Changes**
38+
39+
- In drawing methods ``max_tree_height`` and ``tree_height_scale`` have been deprecated
40+
in favour of ``max_time`` and ``time_scale``
41+
(:user:`benjeffery`,:issue:`1262`, :pr:`1331`).
42+
3743
**Fixes**
3844

3945
- Tree sequences were not properly init'd after unpickling

python/tests/test_drawing.py

Lines changed: 85 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -590,9 +590,15 @@ def test_unused_args(self):
590590
with pytest.raises(ValueError):
591591
t.draw(format=self.drawing_format, node_colours={})
592592
with pytest.raises(ValueError):
593-
t.draw(format=self.drawing_format, max_tree_height=1234)
593+
t.draw(format=self.drawing_format, max_time=1234)
594594
with pytest.raises(ValueError):
595-
t.draw(format=self.drawing_format, tree_height_scale="time")
595+
with pytest.warns(FutureWarning):
596+
t.draw(format=self.drawing_format, max_tree_height=1234)
597+
with pytest.raises(ValueError):
598+
t.draw(format=self.drawing_format, time_scale="time")
599+
with pytest.raises(ValueError):
600+
with pytest.warns(FutureWarning):
601+
t.draw(format=self.drawing_format, tree_height_scale="time")
596602

597603

598604
class TestDrawUnicode(TestDrawText):
@@ -1381,7 +1387,7 @@ def test_tree_sequence_non_minlex(self):
13811387
)
13821388
self.verify_text_rendering(ts.draw_text(order="tree"), drawn_tree)
13831389

1384-
def test_max_tree_height(self):
1390+
def test_max_time(self):
13851391
ts = self.get_simple_ts()
13861392
tree = (
13871393
" 9 \n"
@@ -1399,7 +1405,7 @@ def test_max_tree_height(self):
13991405
"0 1 2 3\n"
14001406
)
14011407
t = ts.first()
1402-
self.verify_text_rendering(t.draw_text(max_tree_height="ts"), tree)
1408+
self.verify_text_rendering(t.draw_text(max_time="ts"), tree)
14031409

14041410
tree = (
14051411
" 9 \n"
@@ -1411,10 +1417,10 @@ def test_max_tree_height(self):
14111417
"0 1 2 3\n"
14121418
)
14131419
t = ts.first()
1414-
self.verify_text_rendering(t.draw_text(max_tree_height="tree"), tree)
1415-
for bad_max_tree_height in [1, "sdfr", ""]:
1420+
self.verify_text_rendering(t.draw_text(max_time="tree"), tree)
1421+
for bad_max_time in [1, "sdfr", ""]:
14161422
with pytest.raises(ValueError):
1417-
t.draw_text(max_tree_height=bad_max_tree_height)
1423+
t.draw_text(max_time=bad_max_time)
14181424

14191425

14201426
class TestDrawSvg(TestTreeDraw, xmlunittest.XmlTestMixin):
@@ -1509,7 +1515,7 @@ def test_bad_tick_spacing(self):
15091515
def test_no_mixed_yscales(self):
15101516
ts = self.get_simple_ts()
15111517
with pytest.raises(ValueError, match="varying yscales"):
1512-
ts.draw_svg(y_axis=True, max_tree_height="tree")
1518+
ts.draw_svg(y_axis=True, max_time="tree")
15131519

15141520
def test_draw_defaults(self):
15151521
t = self.get_binary_tree()
@@ -1521,7 +1527,7 @@ def test_draw_defaults(self):
15211527
@pytest.mark.parametrize("y_axis", (True, False))
15221528
@pytest.mark.parametrize("y_label", (True, False))
15231529
@pytest.mark.parametrize(
1524-
"tree_height_scale",
1530+
"time_scale",
15251531
(
15261532
"rank",
15271533
"time",
@@ -1530,15 +1536,15 @@ def test_draw_defaults(self):
15301536
@pytest.mark.parametrize("y_ticks", ([], [0, 1], None))
15311537
@pytest.mark.parametrize("y_gridlines", (True, False))
15321538
def test_draw_svg_y_axis_parameter_combos(
1533-
self, y_axis, y_label, tree_height_scale, y_ticks, y_gridlines
1539+
self, y_axis, y_label, time_scale, y_ticks, y_gridlines
15341540
):
15351541
t = self.get_binary_tree()
15361542
svg = t.draw_svg(
15371543
y_axis=y_axis,
15381544
y_label=y_label,
15391545
y_ticks=y_ticks,
15401546
y_gridlines=y_gridlines,
1541-
tree_height_scale=tree_height_scale,
1547+
time_scale=time_scale,
15421548
)
15431549
self.verify_basic_svg(svg)
15441550
ts = self.get_simple_ts()
@@ -1547,7 +1553,7 @@ def test_draw_svg_y_axis_parameter_combos(
15471553
y_label=y_label,
15481554
y_ticks=y_ticks,
15491555
y_gridlines=y_gridlines,
1550-
tree_height_scale=tree_height_scale,
1556+
time_scale=time_scale,
15511557
)
15521558
self.verify_basic_svg(svg, width=200 * ts.num_trees)
15531559

@@ -1680,46 +1686,57 @@ def test_one_mutation_label_colour(self):
16801686
self.verify_basic_svg(svg)
16811687
assert svg.count(f'stroke="{colour}"') == 1
16821688

1683-
def test_bad_tree_height_scale(self):
1689+
def test_bad_time_scale(self):
16841690
t = self.get_binary_tree()
16851691
for bad_scale in ["te", "asdf", "", [], b"23"]:
16861692
with pytest.raises(ValueError):
1687-
t.draw_svg(tree_height_scale=bad_scale)
1693+
t.draw_svg(time_scale=bad_scale)
1694+
with pytest.raises(ValueError):
1695+
with pytest.warns(FutureWarning):
1696+
t.draw_svg(tree_height_scale=bad_scale)
16881697

1689-
def test_bad_max_tree_height(self):
1698+
def test_bad_max_time(self):
16901699
t = self.get_binary_tree()
16911700
for bad_height in ["te", "asdf", "", [], b"23"]:
16921701
with pytest.raises(ValueError):
1693-
t.draw_svg(max_tree_height=bad_height)
1702+
t.draw_svg(max_time=bad_height)
1703+
with pytest.raises(ValueError):
1704+
with pytest.warns(FutureWarning):
1705+
t.draw_svg(max_tree_height=bad_height)
16941706

1695-
def test_height_scale_time_and_max_tree_height(self):
1707+
def test_time_scale_time_and_max_time(self):
16961708
ts = msprime.simulate(5, recombination_rate=2, random_seed=2)
16971709
t = ts.first()
16981710
# The default should be the same as tree.
1699-
svg1 = t.draw_svg(max_tree_height="tree")
1711+
svg1 = t.draw_svg(max_time="tree")
17001712
self.verify_basic_svg(svg1)
17011713
svg2 = t.draw_svg()
17021714
assert svg1 == svg2
1703-
svg3 = t.draw_svg(max_tree_height="ts")
1715+
svg3 = t.draw_svg(max_time="ts")
17041716
assert svg1 != svg3
1705-
svg4 = t.draw_svg(max_tree_height=max(ts.tables.nodes.time))
1717+
svg4 = t.draw_svg(max_time=max(ts.tables.nodes.time))
17061718
assert svg3 == svg4
1707-
1708-
def test_height_scale_rank_and_max_tree_height(self):
1709-
# Make sure the rank height scale and max_tree_height interact properly.
1719+
with pytest.warns(FutureWarning):
1720+
svg5 = t.draw_svg(max_tree_height="tree")
1721+
assert svg5 == svg1
1722+
svg6 = t.draw_svg(max_time="tree", max_tree_height="i should be ignored")
1723+
assert svg6 == svg1
1724+
1725+
def test_time_scale_rank_and_max_time(self):
1726+
# Make sure the rank height scale and max_time interact properly.
17101727
ts = msprime.simulate(5, recombination_rate=2, random_seed=2)
17111728
t = ts.first()
17121729
# The default should be the same as tree.
1713-
svg1 = t.draw_svg(max_tree_height="tree", tree_height_scale="rank")
1730+
svg1 = t.draw_svg(max_time="tree", time_scale="rank")
17141731
self.verify_basic_svg(svg1)
1715-
svg2 = t.draw_svg(tree_height_scale="rank")
1732+
svg2 = t.draw_svg(time_scale="rank")
17161733
assert svg1 == svg2
1717-
svg3 = t.draw_svg(max_tree_height="ts", tree_height_scale="rank")
1734+
svg3 = t.draw_svg(max_time="ts", time_scale="rank")
17181735
assert svg1 != svg3
17191736
self.verify_basic_svg(svg3)
1720-
# Numeric max tree height not supported for rank scale.
1737+
# Numeric max time not supported for rank scale.
17211738
with pytest.raises(ValueError):
1722-
t.draw_svg(max_tree_height=2, tree_height_scale="rank")
1739+
t.draw_svg(max_time=2, time_scale="rank")
17231740

17241741
#
17251742
# TODO: update the tests below here to check the new SVG based interface.
@@ -1826,7 +1843,7 @@ def test_extra_mutations(self, all_muts, x_axis):
18261843
svg_no_css = svg[svg.find("</style>") :]
18271844
assert svg_no_css.count("extra") == 1 * extra_mut_copies
18281845

1829-
def test_max_tree_height(self):
1846+
def test_max_time(self):
18301847
nodes = io.StringIO(
18311848
"""\
18321849
id is_sample time
@@ -1862,8 +1879,11 @@ def test_max_tree_height(self):
18621879
snippet2 = svg2[svg2.rfind("edge", 0, str_pos) : str_pos]
18631880
assert snippet1 != snippet2
18641881

1865-
svg1 = ts.at_index(0).draw(max_tree_height="ts")
1866-
svg2 = ts.at_index(1).draw(max_tree_height="ts")
1882+
svg1 = ts.at_index(0).draw(max_time="ts")
1883+
svg2 = ts.at_index(1).draw(max_time="ts")
1884+
with pytest.warns(FutureWarning):
1885+
svg3 = ts.at_index(1).draw(max_tree_height="ts")
1886+
assert svg3 == svg2
18671887
# when scaled, node 3 should be at the *same* height in both trees, so the edge
18681888
# definition should be the same
18691889
self.verify_basic_svg(svg1)
@@ -1913,25 +1933,36 @@ def test_draw_integer_breaks_ts(self):
19131933

19141934
def test_draw_even_height_ts(self):
19151935
ts = msprime.simulate(5, recombination_rate=1, random_seed=1)
1916-
svg = ts.draw_svg(max_tree_height="tree")
1936+
svg = ts.draw_svg(max_time="tree")
1937+
self.verify_basic_svg(svg, width=200 * ts.num_trees)
1938+
with pytest.warns(FutureWarning):
1939+
svg = ts.draw_svg(max_tree_height="tree")
19171940
self.verify_basic_svg(svg, width=200 * ts.num_trees)
19181941

19191942
def test_draw_sized_ts(self):
19201943
ts = msprime.simulate(5, recombination_rate=1, random_seed=1)
19211944
svg = ts.draw_svg(size=(600, 400))
19221945
self.verify_basic_svg(svg, width=600, height=400)
19231946

1924-
def test_tree_height_scale(self):
1947+
def test_time_scale(self):
19251948
ts = msprime.simulate(4, random_seed=2)
1926-
svg = ts.draw_svg(tree_height_scale="time")
1949+
svg = ts.draw_svg(time_scale="time")
19271950
self.verify_basic_svg(svg)
1928-
svg = ts.draw_svg(tree_height_scale="log_time")
1951+
svg = ts.draw_svg(time_scale="log_time")
19291952
self.verify_basic_svg(svg)
1930-
svg = ts.draw_svg(tree_height_scale="rank")
1953+
with pytest.warns(FutureWarning):
1954+
svg2 = ts.draw_svg(tree_height_scale="log_time")
1955+
assert svg2 == svg
1956+
svg = ts.draw_svg(time_scale="rank")
19311957
self.verify_basic_svg(svg)
1958+
svg3 = ts.draw_svg(time_scale="rank", tree_height_scale="ignore me please")
1959+
assert svg3 == svg
19321960
for bad_scale in [0, "", "NOT A SCALE"]:
19331961
with pytest.raises(ValueError):
1934-
ts.draw_svg(tree_height_scale=bad_scale)
1962+
ts.draw_svg(time_scale=bad_scale)
1963+
with pytest.raises(ValueError):
1964+
with pytest.warns(FutureWarning):
1965+
ts.draw_svg(tree_height_scale=bad_scale)
19351966

19361967
def test_x_scale(self):
19371968
ts = msprime.simulate(4, random_seed=2)
@@ -1963,7 +1994,15 @@ def test_y_axis(self):
19631994
("log_time", "Time"),
19641995
("rank", "Node time"),
19651996
]:
1966-
svg = tree.draw_svg(y_axis=True, tree_height_scale=hscale)
1997+
svg = tree.draw_svg(y_axis=True, time_scale=hscale)
1998+
if hscale is not None:
1999+
with pytest.warns(FutureWarning):
2000+
svg2 = tree.draw_svg(y_axis=True, tree_height_scale=hscale)
2001+
assert svg2 == svg
2002+
svg3 = tree.draw_svg(
2003+
y_axis=True, time_scale=hscale, tree_height_scale="ignore me please"
2004+
)
2005+
assert svg3 == svg
19672006
svg_no_css = svg[svg.find("</style>") :]
19682007
assert label in svg_no_css
19692008
assert svg_no_css.count("axes") == 1
@@ -2012,11 +2051,9 @@ def test_no_edges_show_empty(self):
20122051
tables = full_ts.dump_tables()
20132052
tables.edges.clear()
20142053
ts = tables.tree_sequence()
2015-
for tree_height_scale in ("time", "log_time", "rank"):
2054+
for time_scale in ("time", "log_time", "rank"):
20162055
# SVG should just be a row of 10 sample nodes
2017-
svg = ts.draw_svg(
2018-
tree_height_scale=tree_height_scale, x_lim=[0, ts.sequence_length]
2019-
)
2056+
svg = ts.draw_svg(time_scale=time_scale, x_lim=[0, ts.sequence_length])
20202057
self.verify_basic_svg(svg)
20212058
assert svg.count("rect") == 10 # Sample nodes are rectangles
20222059
assert svg.count('path class="edge"') == 0
@@ -2199,7 +2236,7 @@ def test_known_svg_tree_y_axis_rank(self, overwrite_viz, draw_plotbox):
21992236
y_axis=True,
22002237
y_label=label,
22012238
y_gridlines=True,
2202-
tree_height_scale="rank",
2239+
time_scale="rank",
22032240
style=".y-axis line.grid {stroke: #CCCCCC}",
22042241
debug_box=draw_plotbox,
22052242
)
@@ -2292,13 +2329,9 @@ def test_known_svg_ts_highlighted_mut(self, overwrite_viz, draw_plotbox):
22922329

22932330
def test_known_svg_ts_rank(self, overwrite_viz, draw_plotbox):
22942331
ts = self.get_simple_ts()
2295-
svg1 = ts.draw_svg(
2296-
tree_height_scale="rank", y_axis=True, debug_box=draw_plotbox
2297-
)
2332+
svg1 = ts.draw_svg(time_scale="rank", y_axis=True, debug_box=draw_plotbox)
22982333
ts = self.get_simple_ts(use_mutation_times=True)
2299-
svg2 = ts.draw_svg(
2300-
tree_height_scale="rank", y_axis=True, debug_box=draw_plotbox
2301-
)
2334+
svg2 = ts.draw_svg(time_scale="rank", y_axis=True, debug_box=draw_plotbox)
23022335
assert svg1.count('class="site ') == ts.num_sites
23032336
assert svg1.count('class="mut ') == ts.num_mutations * 2
23042337
assert svg1.replace(" unknown_time", "") == svg2 # Trim the unknown_time class
@@ -2309,7 +2342,7 @@ def test_known_svg_ts_rank(self, overwrite_viz, draw_plotbox):
23092342
@pytest.mark.skip(reason="Fails on CI as OSX gives different random numbers")
23102343
def test_known_svg_nonbinary_ts(self, overwrite_viz, draw_plotbox):
23112344
ts = self.get_nonbinary_ts()
2312-
svg = ts.draw_svg(tree_height_scale="log_time", debug_box=draw_plotbox)
2345+
svg = ts.draw_svg(time_scale="log_time", debug_box=draw_plotbox)
23132346
assert svg.count('class="site ') == ts.num_sites
23142347
assert svg.count('class="mut ') == ts.num_mutations * 2
23152348
self.verify_known_svg(
@@ -2395,7 +2428,7 @@ def test_known_svg_ts_y_axis_log(self, overwrite_viz, draw_plotbox):
23952428
svg = ts.draw_svg(
23962429
y_axis=True,
23972430
y_label="Time (log scale)",
2398-
tree_height_scale="log_time",
2431+
time_scale="log_time",
23992432
debug_box=draw_plotbox,
24002433
)
24012434
self.verify_known_svg(
@@ -2413,7 +2446,7 @@ def test_known_svg_ts_mutation_times(self, overwrite_viz, draw_plotbox):
24132446

24142447
def test_known_svg_ts_mutation_times_logscale(self, overwrite_viz, draw_plotbox):
24152448
ts = self.get_simple_ts(use_mutation_times=True)
2416-
svg = ts.draw_svg(tree_height_scale="log_time", debug_box=draw_plotbox)
2449+
svg = ts.draw_svg(time_scale="log_time", debug_box=draw_plotbox)
24172450
assert svg.count('class="site ') == ts.num_sites
24182451
assert svg.count('class="mut ') == ts.num_mutations * 2
24192452
self.verify_known_svg(

python/tests/tsutil.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def insert_discrete_time_mutations(ts, num_times=4, num_sites=10):
138138
"""
139139
Inserts mutations in the tree sequence at regularly-spaced num_sites
140140
positions, at only a discrete set of times (the same for all trees): at
141-
num_times times evenly spaced between 0 and the maximum tree height.
141+
num_times times evenly spaced between 0 and the maximum time.
142142
"""
143143
tables = ts.tables
144144
tables.sites.clear()

0 commit comments

Comments
 (0)