Skip to content

Commit f98d601

Browse files
committed
Simplified everything
1 parent ff54405 commit f98d601

5 files changed

Lines changed: 70 additions & 248 deletions

File tree

malariagen_data/anoph/gplt_params.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Parameters for genome plotting functions. N.B., genome plots are always
22
plotted with bokeh."""
33

4-
from typing import Literal, Mapping, Optional, Union, Final
4+
from typing import Literal, Mapping, Optional, Union, Final, Sequence
55

66
import bokeh.models
77
from typing_extensions import Annotated, TypeAlias
@@ -109,20 +109,9 @@
109109
"A dictionary of arguments passed through to bokeh scatter() function with marker = 'circle' with a value per contig.",
110110
]
111111

112-
default_circle_kwargs_dict: Final[dict[int, circle_kwargs]] = {
113-
0: {"line_color": "red", "size": 3, "line_width": 1, "fill_color": None},
114-
1: {"line_color": "blue", "size": 3, "line_width": 1, "fill_color": None},
115-
2: {"line_color": "orange", "size": 3, "line_width": 1, "fill_color": None},
116-
3: {"line_color": "green", "size": 3, "line_width": 1, "fill_color": None},
117-
4: {"line_color": "purple", "size": 3, "line_width": 1, "fill_color": None},
118-
}
119-
120-
circle_kwargs_list: TypeAlias = Annotated[
121-
list[circle_kwargs],
122-
"A list of arguments passed through to bokeh scatter() function with marker = 'circle' with a value per contig.",
112+
contig_colors: TypeAlias = Annotated[
113+
Sequence[str],
114+
"A sequence of colors.",
123115
]
124116

125-
circle_kwargs_param: TypeAlias = Annotated[
126-
Union[circle_kwargs, circle_kwargs_dict, circle_kwargs_list],
127-
"A set of arguments passed through to bokeh scatter() function with marker = 'circle'.",
128-
]
117+
contig_colors_default: Final[contig_colors] = bokeh.palettes.d3["Category20b"][5]

malariagen_data/anoph/h12.py

Lines changed: 15 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,13 @@ def _h12_gwss_contig(
258258
# Compute window midpoints.
259259
pos = ds_haps["variant_position"].values
260260
x = allel.moving_statistic(pos, statistic=np.mean, size=window_size)
261-
contigs = allel.moving_statistic(
262-
ds_haps["variant_contig"].values, statistic=np.median, size=window_size
261+
contigs = np.asarray(
262+
allel.moving_statistic(
263+
ds_haps["variant_contig"].values,
264+
statistic=np.median,
265+
size=window_size,
266+
),
267+
dtype=int,
263268
)
264269

265270
results = dict(x=x, h12=h12, contigs=contigs)
@@ -438,7 +443,9 @@ def plot_h12_gwss_track(
438443
sizing_mode: gplt_params.sizing_mode = gplt_params.sizing_mode_default,
439444
width: gplt_params.width = gplt_params.width_default,
440445
height: gplt_params.height = 200,
441-
circle_kwargs_param: Optional[gplt_params.circle_kwargs_param] = None,
446+
contig_colors: Optional[
447+
gplt_params.contig_colors
448+
] = gplt_params.contig_colors_default,
442449
show: gplt_params.show = True,
443450
x_range: Optional[gplt_params.x_range] = None,
444451
output_backend: gplt_params.output_backend = gplt_params.output_backend_default,
@@ -460,100 +467,6 @@ def plot_h12_gwss_track(
460467
inline_array=inline_array,
461468
)
462469

463-
circle_kwargs_param_dict: dict[int, gplt_params.circle_kwargs] = {}
464-
if circle_kwargs_param is None:
465-
circle_kwargs_param_dict = gplt_params.default_circle_kwargs_dict
466-
elif isinstance(circle_kwargs_param, list):
467-
if len(circle_kwargs_param) >= 5:
468-
circle_kwargs_param_dict = {
469-
i: circle_kwargs_param[i] for i in range(0, 5)
470-
}
471-
else:
472-
circle_kwargs_param_dict = {
473-
i: circle_kwargs_param[i]
474-
for i in range(0, len(circle_kwargs_param))
475-
}
476-
circle_kwargs_param_dict.update(
477-
{
478-
i: gplt_params.default_circle_kwargs_dict[i]
479-
for i in range(len(circle_kwargs_param), 5)
480-
}
481-
)
482-
elif isinstance(circle_kwargs_param, dict):
483-
if isinstance(list(circle_kwargs_param.keys())[0], str):
484-
if list(circle_kwargs_param.keys())[0] in [
485-
"2L",
486-
"2R",
487-
"3L",
488-
"3R",
489-
"X",
490-
"2RL",
491-
"3RL",
492-
]:
493-
for i in range(0, 5):
494-
if i == 0:
495-
ck = circle_kwargs_param["2L"]
496-
if "2L" in circle_kwargs_param.keys(): # Ag3
497-
circle_kwargs_param_dict[i] = ck
498-
elif "2RL" in circle_kwargs_param.keys(): # Af1
499-
circle_kwargs_param_dict[
500-
i
501-
] = gplt_params.default_circle_kwargs_dict[
502-
i
503-
] # circle_kwargs_param["2RL"]
504-
else:
505-
circle_kwargs_param_dict[
506-
i
507-
] = gplt_params.default_circle_kwargs_dict[i]
508-
elif i == 1:
509-
if "2R" in circle_kwargs_param.keys(): # Ag3
510-
circle_kwargs_param_dict[i] = circle_kwargs_param["2R"]
511-
elif "3RL" in circle_kwargs_param.keys(): # Af1
512-
circle_kwargs_param_dict[i] = circle_kwargs_param["3RL"]
513-
else:
514-
circle_kwargs_param_dict[
515-
i
516-
] = gplt_params.default_circle_kwargs_dict[i]
517-
elif i == 2:
518-
if "3L" in circle_kwargs_param.keys(): # Ag3
519-
circle_kwargs_param_dict[i] = circle_kwargs_param["3L"]
520-
elif "X" in circle_kwargs_param.keys(): # Af1
521-
circle_kwargs_param_dict[i] = circle_kwargs_param["X"]
522-
else:
523-
circle_kwargs_param_dict[
524-
i
525-
] = gplt_params.default_circle_kwargs_dict[i]
526-
elif i == 3:
527-
if "3R" in circle_kwargs_param.keys(): # Ag3
528-
circle_kwargs_param_dict[i] = circle_kwargs_param["3R"]
529-
else:
530-
circle_kwargs_param_dict[
531-
i
532-
] = gplt_params.default_circle_kwargs_dict[i]
533-
elif i == 4:
534-
if (
535-
"X" in circle_kwargs_param.keys()
536-
): # Ag3. Will also get a value for Af1 but it will be ignored.
537-
circle_kwargs_param_dict[i] = circle_kwargs_param["X"]
538-
else:
539-
circle_kwargs_param_dict[
540-
i
541-
] = gplt_params.default_circle_kwargs_dict[i]
542-
else:
543-
circle_kwargs_param_dict = {
544-
i: circle_kwargs_param for i in range(0, 5)
545-
}
546-
elif isinstance(list(circle_kwargs_param.keys())[0], int):
547-
for i in range(0, 5):
548-
if i in list(circle_kwargs_param.keys()):
549-
circle_kwargs_param_dict[i] = circle_kwargs_param[i]
550-
else:
551-
circle_kwargs_param_dict[
552-
i
553-
] = gplt_params.default_circle_kwargs_dict[i]
554-
else:
555-
circle_kwargs_param_dict = gplt_params.default_circle_kwargs_dict
556-
557470
# Determine X axis range.
558471
x_min = x[0]
559472
x_max = x[-1]
@@ -592,12 +505,11 @@ def plot_h12_gwss_track(
592505
# Plot H12.
593506
for s in set(contigs):
594507
idxs = contigs == s
595-
circle_kwargs_mutable = circle_kwargs_param_dict[s]
596508
fig.scatter(
597509
x=x[idxs],
598510
y=h12[idxs],
599511
marker="circle",
600-
**circle_kwargs_mutable,
512+
color=contig_colors[s % len(contig_colors)],
601513
)
602514

603515
# Tidy up the plot.
@@ -634,7 +546,9 @@ def plot_h12_gwss(
634546
sizing_mode: gplt_params.sizing_mode = gplt_params.sizing_mode_default,
635547
width: gplt_params.width = gplt_params.width_default,
636548
track_height: gplt_params.track_height = 170,
637-
circle_kwargs_param: Optional[gplt_params.circle_kwargs_param] = None,
549+
contig_colors: Optional[
550+
gplt_params.contig_colors
551+
] = gplt_params.contig_colors_default,
638552
genes_height: gplt_params.genes_height = gplt_params.genes_height_default,
639553
show: gplt_params.show = True,
640554
output_backend: gplt_params.output_backend = gplt_params.output_backend_default,
@@ -656,7 +570,7 @@ def plot_h12_gwss(
656570
sizing_mode=sizing_mode,
657571
width=width,
658572
height=track_height,
659-
circle_kwargs_param=circle_kwargs_param,
573+
contig_colors=contig_colors,
660574
show=False,
661575
output_backend=output_backend,
662576
chunks=chunks,

malariagen_data/anoph/h1x.py

Lines changed: 15 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,13 @@ def _h1x_gwss_contig(
8080
# Compute window midpoints.
8181
pos = ds1["variant_position"].values
8282
x = allel.moving_statistic(pos, statistic=np.mean, size=window_size)
83-
contigs = allel.moving_statistic(
84-
ds1["variant_contig"].values, statistic=np.median, size=window_size
83+
contigs = np.asarray(
84+
allel.moving_statistic(
85+
ds1["variant_contig"].values,
86+
statistic=np.median,
87+
size=window_size,
88+
),
89+
dtype=int,
8590
)
8691

8792
results = dict(x=x, h1x=h1x, contigs=contigs)
@@ -277,7 +282,9 @@ def plot_h1x_gwss_track(
277282
sizing_mode: gplt_params.sizing_mode = gplt_params.sizing_mode_default,
278283
width: gplt_params.width = gplt_params.width_default,
279284
height: gplt_params.height = 200,
280-
circle_kwargs_param: Optional[gplt_params.circle_kwargs_param] = None,
285+
contig_colors: Optional[
286+
gplt_params.contig_colors
287+
] = gplt_params.contig_colors_default,
281288
show: gplt_params.show = True,
282289
x_range: Optional[gplt_params.x_range] = None,
283290
output_backend: gplt_params.output_backend = gplt_params.output_backend_default,
@@ -300,97 +307,6 @@ def plot_h1x_gwss_track(
300307
inline_array=inline_array,
301308
)
302309

303-
circle_kwargs_param_dict: dict[int, gplt_params.circle_kwargs] = {}
304-
if circle_kwargs_param is None:
305-
circle_kwargs_param_dict = gplt_params.default_circle_kwargs_dict
306-
elif isinstance(circle_kwargs_param, list):
307-
if len(circle_kwargs_param) >= 5:
308-
circle_kwargs_param_dict = {
309-
i: circle_kwargs_param[i] for i in range(0, 5)
310-
}
311-
else:
312-
circle_kwargs_param_dict = {
313-
i: circle_kwargs_param[i]
314-
for i in range(0, len(circle_kwargs_param))
315-
}
316-
circle_kwargs_param_dict.update(
317-
{
318-
i: gplt_params.default_circle_kwargs_dict[i]
319-
for i in range(len(circle_kwargs_param), 5)
320-
}
321-
)
322-
elif isinstance(circle_kwargs_param, dict):
323-
if isinstance(list(circle_kwargs_param.keys())[0], str):
324-
if list(circle_kwargs_param.keys())[0] in [
325-
"2L",
326-
"2R",
327-
"3L",
328-
"3R",
329-
"X",
330-
"2RL",
331-
"3RL",
332-
]:
333-
for i in range(0, 5):
334-
if i == 0:
335-
if "2L" in circle_kwargs_param.keys(): # Ag3
336-
circle_kwargs_param_dict[i] = circle_kwargs_param["2L"]
337-
elif "2RL" in circle_kwargs_param.keys(): # Af1
338-
circle_kwargs_param_dict[i] = circle_kwargs_param["2RL"]
339-
else:
340-
circle_kwargs_param_dict[
341-
i
342-
] = gplt_params.default_circle_kwargs_dict[i]
343-
elif i == 1:
344-
if "2R" in circle_kwargs_param.keys(): # Ag3
345-
circle_kwargs_param_dict[i] = circle_kwargs_param["2R"]
346-
elif "3RL" in circle_kwargs_param.keys(): # Af1
347-
circle_kwargs_param_dict[i] = circle_kwargs_param["3RL"]
348-
else:
349-
circle_kwargs_param_dict[
350-
i
351-
] = gplt_params.default_circle_kwargs_dict[i]
352-
elif i == 2:
353-
if "3L" in circle_kwargs_param.keys(): # Ag3
354-
circle_kwargs_param_dict[i] = circle_kwargs_param["3L"]
355-
elif "X" in circle_kwargs_param.keys(): # Af1
356-
circle_kwargs_param_dict[i] = circle_kwargs_param["X"]
357-
else:
358-
circle_kwargs_param_dict[
359-
i
360-
] = gplt_params.default_circle_kwargs_dict[i]
361-
elif i == 3:
362-
if "3R" in circle_kwargs_param.keys(): # Ag3
363-
circle_kwargs_param_dict[i] = circle_kwargs_param["3R"]
364-
else:
365-
circle_kwargs_param_dict[
366-
i
367-
] = gplt_params.default_circle_kwargs_dict[i]
368-
elif i == 4:
369-
if (
370-
"X" in circle_kwargs_param.keys()
371-
): # Ag3. Will also get a value for Af1 but it will be ignored.
372-
circle_kwargs_param_dict[i] = circle_kwargs_param["X"]
373-
else:
374-
circle_kwargs_param_dict[
375-
i
376-
] = gplt_params.default_circle_kwargs_dict[i]
377-
else:
378-
print("circle_kwargs")
379-
circle_kwargs_param_dict = {
380-
i: circle_kwargs_param for i in range(0, 5)
381-
}
382-
elif isinstance(list(circle_kwargs_param.keys())[0], int):
383-
circle_kwargs_param_dict = {}
384-
for i in range(0, 5):
385-
if i in list(circle_kwargs_param.keys()):
386-
circle_kwargs_param_dict[i] = circle_kwargs_param[i]
387-
else:
388-
circle_kwargs_param_dict[
389-
i
390-
] = gplt_params.default_circle_kwargs_dict[i]
391-
else:
392-
circle_kwargs_param_dict = gplt_params.default_circle_kwargs_dict
393-
394310
# Determine X axis range.
395311
x_min = x[0]
396312
x_max = x[-1]
@@ -429,12 +345,11 @@ def plot_h1x_gwss_track(
429345
# Plot H1X.
430346
for s in set(contigs):
431347
idxs = contigs == s
432-
circle_kwargs_mutable = circle_kwargs_param_dict[s]
433348
fig.scatter(
434349
x=x[idxs],
435350
y=h1x[idxs],
436351
marker="circle",
437-
**circle_kwargs_mutable,
352+
color=contig_colors[s % len(contig_colors)],
438353
)
439354

440355
# Tidy up the plot.
@@ -475,7 +390,9 @@ def plot_h1x_gwss(
475390
sizing_mode: gplt_params.sizing_mode = gplt_params.sizing_mode_default,
476391
width: gplt_params.width = gplt_params.width_default,
477392
track_height: gplt_params.track_height = 190,
478-
circle_kwargs_param: Optional[gplt_params.circle_kwargs_param] = None,
393+
contig_colors: Optional[
394+
gplt_params.contig_colors
395+
] = gplt_params.contig_colors_default,
479396
genes_height: gplt_params.genes_height = gplt_params.genes_height_default,
480397
show: gplt_params.show = True,
481398
output_backend: gplt_params.output_backend = gplt_params.output_backend_default,
@@ -498,7 +415,7 @@ def plot_h1x_gwss(
498415
sizing_mode=sizing_mode,
499416
width=width,
500417
height=track_height,
501-
circle_kwargs_param=circle_kwargs_param,
418+
contig_colors=contig_colors,
502419
show=False,
503420
output_backend=output_backend,
504421
chunks=chunks,

tests/anoph/test_h12.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -142,22 +142,27 @@ def check_h12_gwss(*, api, h12_params):
142142
assert np.all(h12 >= 0)
143143
assert np.all(h12 <= 1)
144144

145-
circle_kwargs_dict = {
146-
0: {"line_color": "black", "size": 5, "line_width": 1, "fill_color": None},
147-
1: {"line_color": "green", "size": 4, "line_width": 2, "fill_color": "black"},
148-
2: {"line_color": "orange", "size": 3, "line_width": 1, "fill_color": None},
149-
3: {"line_color": "green", "size": 2, "line_width": 2, "fill_color": "black"},
150-
4: {"line_color": "purple", "size": 1, "line_width": 1, "fill_color": None},
151-
}
145+
x, h12, contigs = api.h12_gwss_contig(**h12_params)
146+
147+
# Check results.
148+
assert isinstance(x, np.ndarray)
149+
assert isinstance(h12, np.ndarray)
150+
assert isinstance(contigs, np.ndarray)
151+
assert x.ndim == 1
152+
assert h12.ndim == 1
153+
assert contigs.ndim == 1
154+
assert x.shape == h12.shape
155+
assert x.shape == contigs.shape
156+
assert x.dtype.kind == "f"
157+
assert h12.dtype.kind == "f"
158+
assert contigs.dtype.kind == "i"
159+
assert np.all(h12 >= 0)
160+
assert np.all(h12 <= 1)
152161

153162
# Check plotting functions.
154-
fig = api.plot_h12_gwss_track(
155-
**h12_params, circle_kwargs_param=circle_kwargs_dict, show=False
156-
)
163+
fig = api.plot_h12_gwss_track(**h12_params, show=False)
157164
assert isinstance(fig, bokeh.models.Plot)
158-
fig = api.plot_h12_gwss(
159-
**h12_params, circle_kwargs_param=circle_kwargs_dict[0], show=False
160-
)
165+
fig = api.plot_h12_gwss(**h12_params, contig_colors=["black", "red"], show=False)
161166
assert isinstance(fig, bokeh.models.GridPlot)
162167

163168

0 commit comments

Comments
 (0)