Source code for trackc.pl.vhighlight

from typing import Sequence, Union

import bioframe as bf
from matplotlib.axes import Axes

from trackc.pl.zoomin import _region_pos


[docs]def vhighlight( axs: Union[Sequence[Axes], Axes, None] = None, regions: Union[Sequence[str], str, None] = None, light_regions: Union[Sequence[str], str, None] = None, colors: Union[Sequence[str], None] = "yellow", alpha: float = 0.3, ): """ Plot vhighlight track, support for multiple or reverse genome regions. Parameters ---------- axs: :class:`matplotlib.axes.Axes` object regions: `str` | `str list` The raw genome regions, some of these regions will be selected to zoom in. e.g. ``"chr6:1000000-2000000"`` or ``["chr6:1000000-2000000", "chr3:5000000-4000000", "chr5"]`` The start can be larger than the end (eg. ``"chr6:2000000-1000000"``), which means the reverse region light_regions: `str` | `str list` regions to be zoomin, The format is the same as `regions`. the regions of `light_regions` should be located in the `regions` colors: `str list` the colors of the light_regions alpha: `float` alpha of plot color Example ------- >>> regions = ['18:47400000-48280000', '18:75280000-74030000'] >>> light_regions = ['18:47950000-48280000', '18:75280000-74850000'] >>> ten = tc.tenon(figsize=(6,1)) >>> ten.add(pos='bottom', height=1, hspace=0.1) >>> ten.add(pos='bottom', height=1, hspace=0.1) >>> ten.add(pos='bottom', height=1, hspace=0.1) >>> tc.pl.vhighlight(axs=[ten.axs(0), ten.axs(1)], colors=['y', 'b'], regions=regions, light_regions=light_regions) >>> tc.pl.multi_scale_track(ten.axs(2), regions=regions, scale_adjust='Mb', intervals=2) """ if isinstance(regions, str): regions = [regions] if isinstance(light_regions, str): light_regions = [light_regions] row_GRs = _region_pos(regions) light_GRs = _region_pos(light_regions) len_sum = sum(row_GRs["len"]) row_GRs = row_GRs[ ["chrom", "fetch_start", "fetch_end", "isReverse", "len", "ps", "pe"] ] row_GRs.columns = ["chrom", "start", "end", "isReverse", "len", "ps", "pe"] light_GRs["light_width"] = light_GRs["len"] / len_sum light_GRs = light_GRs[["chrom", "fetch_start", "fetch_end", "light_width"]] light_GRs.columns = ["chrom", "start", "end", "light_width"] row_GRs = row_GRs.reset_index() light_GRs = light_GRs.reset_index() del light_GRs["index"] del row_GRs["index"] light_r = bf.overlap(light_GRs, row_GRs) light_r = light_r.query("chrom_==chrom_") light_r["light_s"] = 0 light_r_cp = light_r.copy() for i, row in light_r_cp.iterrows(): if row["isReverse_"] == True: light_r.loc[i, "light_s"] = ( row["ps_"] + abs(row["end"] - row["end_"]) / len_sum ) else: light_r.loc[i, "light_s"] = ( row["ps_"] + abs(row["start"] - row["start_"]) / len_sum ) if isinstance(colors, list) == False: colors = [colors] if len(colors) < light_r.shape[0]: repeat_times = (light_r.shape[0] + len(colors) - 1) // len(colors) colors = (colors * repeat_times)[: light_r.shape[0]] for ix, aix in enumerate(axs): # trans = transforms.blended_transform_factory( # aix.transAxes, aix.transAxes) aix.bar( x=light_r["light_s"], height=1, width=light_r["light_width"], transform=aix.transAxes, align="edge", color=colors, # zorder=50, clip_on=False, alpha=alpha, )