def draw_gene_legend( ax, x1, x2, ytop, d=0.04, text=False, repeat=False, glyphstyle="box", ): forward, backward = OrientationPalette.forward, OrientationPalette.backward ax.plot([x1, x1 + d], [ytop, ytop], ":", color=forward, lw=2) ax.plot([x1 + d], [ytop], ">", color=forward, mec=forward) ax.plot([x2, x2 + d], [ytop, ytop], ":", color=backward, lw=2) ax.plot([x2], [ytop], "<", color=backward, mec="g") if text: ax.text(x1 + d / 2, ytop + d / 2, "gene (+)", ha="center") ax.text(x2 + d / 2, ytop + d / 2, "gene (-)", ha="center") if repeat: xr = (x1 + x2 + d) / 2 Glyph( ax, xr - d / 2, xr + d / 2, ytop, 0.012 * 3 / 4, gradient=False, fc="#ff7f00", style=glyphstyle, zorder=2, ) ax.text(xr, ytop + d / 2, "repeat", ha="center")
def draw_gene_legend(ax, x1, x2, ytop, d=.04, text=False, repeat=False): ax.plot([x1, x1 + d], [ytop, ytop], ":", color=forward, lw=2) ax.plot([x1 + d], [ytop], ">", color=forward, mec=forward) ax.plot([x2, x2 + d], [ytop, ytop], ":", color=backward, lw=2) ax.plot([x2], [ytop], "<", color=backward, mec="g") if text: ax.text(x1 + d / 2, ytop + d / 2, "gene (+)", ha="center") ax.text(x2 + d / 2, ytop + d / 2, "gene (-)", ha="center") if repeat: xr = (x1 + x2 + d) / 2 Glyph(ax, xr - d / 2, xr + d / 2, ytop, .012 * 3 / 4, gradient=False, fc='#ff7f00', zorder=2) ax.text(xr, ytop + d / 2, "repeat", ha="center")
def __init__(self, ax, ext, layout, bed, scale, switch=None, chr_label=True, loc_label=True, pad=.05, vpad=.015, extra_features=None): x, y = layout.x, layout.y ratio = layout.ratio scale /= ratio self.y = y lr = layout.rotation tr = mpl.transforms.Affine2D().\ rotate_deg_around(x, y, lr) + ax.transAxes inv = ax.transAxes.inverted() start, end, si, ei, chr, orientation, span = ext flank = span / scale / 2 xstart, xend = x - flank, x + flank self.xstart, self.xend = xstart, xend cv = lambda t: xstart + abs(t - startbp) / scale hidden = layout.hidden # Chromosome if not hidden: ax.plot((xstart, xend), (y, y), color="gray", transform=tr, \ lw=2, zorder=1) self.genes = genes = bed[si: ei + 1] startbp, endbp = start.start, end.end if orientation == '-': startbp, endbp = endbp, startbp if switch: chr = switch.get(chr, chr) if layout.label: chr = layout.label label = "-".join((human_size(startbp, target="Mb", precision=2)[:-2], human_size(endbp, target="Mb", precision=2))) height = .012 self.gg = {} # Genes for g in genes: gstart, gend = g.start, g.end strand = g.strand if strand == '-': gstart, gend = gend, gstart if orientation == '-': strand = "+" if strand == "-" else "-" x1, x2, a, b = self.get_coordinates(gstart, gend, y, cv, tr, inv) self.gg[g.accn] = (a, b) color = forward if strand == "+" else backward if not hidden: gp = Glyph(ax, x1, x2, y, height, gradient=False, fc=color, zorder=3) gp.set_transform(tr) # Extra features (like repeats) if extra_features: for g in extra_features: gstart, gend = g.start, g.end x1, x2, a, b = self.get_coordinates(gstart, gend, y, cv, tr, inv) gp = Glyph(ax, x1, x2, y, height * 3 / 4, gradient=False, fc='#ff7f00', zorder=2) gp.set_transform(tr) ha, va = layout.ha, layout.va hpad = .02 if ha == "left": xx = xstart - hpad ha = "right" elif ha == "right": xx = xend + hpad ha = "left" else: xx = x ha = "center" # Tentative solution to labels stick into glyph magic = 40. cc = abs(lr) / magic if abs(lr) > magic else 1 if va == "top": yy = y + cc * pad elif va == "bottom": yy = y - cc * pad else: yy = y l = np.array((xx, yy)) trans_angle = ax.transAxes.transform_angles(np.array((lr, )), l.reshape((1, 2)))[0] lx, ly = l if not hidden: bbox = dict(boxstyle="round", fc='w', ec='w', alpha=.5) kwargs = dict(ha=ha, va="center", rotation=trans_angle, bbox=bbox, zorder=10) # TODO: I spent several hours on trying to make this work - with no # good solutions. To generate labels on multiple lines, each line # with a different style is difficult in matplotlib. The only way, # if you can tolerate an extra dot (.), is to use the recipe below. #chr_label = r"\noindent " + markup(chr) + r" \\ ." if chr_label else None #loc_label = r"\noindent . \\ " + label if loc_label else None chr_label = markup(chr) if chr_label else None loc_label = label if loc_label else None if chr_label: if loc_label: ax.text(lx, ly + vpad, chr_label, color=layout.color, **kwargs) ax.text(lx, ly - vpad, loc_label, color="lightslategrey", size=10, **kwargs) else: ax.text(lx, ly, chr_label, color=layout.color, **kwargs)
def __init__( self, ax, ext, layout, bed, scale, switch=None, chr_label=True, loc_label=True, genelabelsize=0, pad=0.05, vpad=0.015, extra_features=None, glyphstyle="box", glyphcolor: BasePalette = OrientationPalette(), ): x, y = layout.x, layout.y ratio = layout.ratio scale /= ratio self.y = y lr = layout.rotation tr = mpl.transforms.Affine2D().rotate_deg_around(x, y, lr) + ax.transAxes inv = ax.transAxes.inverted() start, end, si, ei, chr, orientation, span = ext flank = span / scale / 2 xstart, xend = x - flank, x + flank self.xstart, self.xend = xstart, xend cv = lambda t: xstart + abs(t - startbp) / scale hidden = layout.hidden # Chromosome if not hidden: ax.plot((xstart, xend), (y, y), color="gray", transform=tr, lw=2, zorder=1) self.genes = genes = bed[si : ei + 1] startbp, endbp = start.start, end.end if orientation == "-": startbp, endbp = endbp, startbp if switch: chr = switch.get(chr, chr) if layout.label: chr = layout.label label = "-".join( ( human_size(startbp, target="Mb", precision=2)[:-2], human_size(endbp, target="Mb", precision=2), ) ) height = 0.012 self.gg = {} # Genes for g in genes: gstart, gend = g.start, g.end strand = g.strand if strand == "-": gstart, gend = gend, gstart if orientation == "-": strand = "+" if strand == "-" else "-" x1, x2, a, b = self.get_coordinates(gstart, gend, y, cv, tr, inv) gene_name = g.accn self.gg[gene_name] = (a, b) color, zorder = ( glyphcolor.get_color_and_zorder(strand) if isinstance(glyphcolor, OrientationPalette) else glyphcolor.get_color_and_zorder(gene_name) ) if hidden: continue gp = Glyph( ax, x1, x2, y, height, gradient=False, fc=color, style=glyphstyle, zorder=zorder, ) gp.set_transform(tr) if genelabelsize: ax.text( (x1 + x2) / 2, y + height / 2 + genelabelsize * vpad / 3, markup(gene_name), size=genelabelsize, rotation=25, ha="left", va="center", color="lightslategray", ) # Extra features (like repeats) if extra_features: for g in extra_features: gstart, gend = g.start, g.end x1, x2, a, b = self.get_coordinates(gstart, gend, y, cv, tr, inv) gp = Glyph( ax, x1, x2, y, height * 3 / 4, gradient=False, fc="#ff7f00", style=glyphstyle, zorder=2, ) gp.set_transform(tr) ha, va = layout.ha, layout.va hpad = 0.02 if ha == "left": xx = xstart - hpad ha = "right" elif ha == "right": xx = xend + hpad ha = "left" else: xx = x ha = "center" # Tentative solution to labels stick into glyph magic = 40.0 cc = abs(lr) / magic if abs(lr) > magic else 1 if va == "top": yy = y + cc * pad elif va == "bottom": yy = y - cc * pad else: yy = y l = np.array((xx, yy)) trans_angle = ax.transAxes.transform_angles(np.array((lr,)), l.reshape((1, 2)))[ 0 ] lx, ly = l if not hidden: bbox = dict(boxstyle="round", fc="w", ec="w", alpha=0.5) kwargs = dict( ha=ha, va="center", rotation=trans_angle, bbox=bbox, zorder=10 ) # TODO: I spent several hours on trying to make this work - with no # good solutions. To generate labels on multiple lines, each line # with a different style is difficult in matplotlib. The only way, # if you can tolerate an extra dot (.), is to use the recipe below. # chr_label = r"\noindent " + markup(chr) + r" \\ ." if chr_label else None # loc_label = r"\noindent . \\ " + label if loc_label else None chr_label = markup(chr) if chr_label else None loc_label = label if loc_label else None if chr_label: if loc_label: ax.text(lx, ly + vpad, chr_label, color=layout.color, **kwargs) ax.text( lx, ly - vpad, loc_label, color="lightslategrey", size=10, **kwargs ) else: ax.text(lx, ly, chr_label, color=layout.color, **kwargs)
def __init__(self, ax, ext, layout, bed, scale, switch=None, chr_label=True, pad=.04, vpad=.012, extra_features=None): x, y = layout.x, layout.y ratio = layout.ratio scale /= ratio self.y = y lr = layout.rotation tr = mpl.transforms.Affine2D().\ rotate_deg_around(x, y, lr) + ax.transAxes inv = ax.transAxes.inverted() start, end, si, ei, chr, orientation, span = ext flank = span / scale / 2 xstart, xend = x - flank, x + flank self.xstart, self.xend = xstart, xend cv = lambda t: xstart + abs(t - startbp) / scale hidden = layout.hidden # Chromosome if not hidden: ax.plot((xstart, xend), (y, y), color="gray", transform=tr, \ lw=2, zorder=1) self.genes = genes = bed[si: ei + 1] startbp, endbp = start.start, end.end if orientation == '-': startbp, endbp = endbp, startbp if switch: chr = switch.get(chr, chr) label = "-".join((human_size(startbp, target="Mb")[:-2], human_size(endbp, target="Mb"))) height = .012 self.gg = {} # Genes for g in genes: gstart, gend = g.start, g.end strand = g.strand if strand == '-': gstart, gend = gend, gstart if orientation == '-': strand = "+" if strand == "-" else "-" x1, x2, a, b = self.get_coordinates(gstart, gend, y, cv, tr, inv) self.gg[g.accn] = (a, b) color = forward if strand == "+" else backward if not hidden: gp = Glyph(ax, x1, x2, y, height, gradient=False, fc=color, zorder=3) gp.set_transform(tr) # Extra features (like repeats) if extra_features: for g in extra_features: gstart, gend = g.start, g.end x1, x2, a, b = self.get_coordinates(gstart, gend, y, cv, tr, inv) gp = Glyph(ax, x1, x2, y, height * 3 / 4, gradient=False, fc='#ff7f00', zorder=2) gp.set_transform(tr) ha, va = layout.ha, layout.va hpad = .02 if ha == "left": xx = xstart - hpad ha = "right" elif ha == "right": xx = xend + hpad ha = "left" else: xx = x ha = "center" # Tentative solution to labels stick into glyph magic = 40. cc = abs(lr) / magic if abs(lr) > magic else 1 if va == "top": yy = y + cc * pad elif va == "bottom": yy = y - cc * pad - .01 else: yy = y l = np.array((xx, yy)) trans_angle = ax.transAxes.transform_angles(np.array((lr, )), l.reshape((1, 2)))[0] lx, ly = l if not hidden and chr_label: bbox = dict(boxstyle="round", fc='w', ec='w', alpha=.5) ax.text(lx, ly + vpad, markup(chr), color=layout.color, ha=ha, va="center", rotation=trans_angle, bbox=bbox, zorder=10) ax.text(lx, ly - vpad, label, color="lightslategrey", size=10, ha=ha, va="center", rotation=trans_angle, bbox=bbox, zorder=10)
def __init__(self, ax, ext, layout, bed, scale, switch=None, chr_label=True, pad=.04, vpad=.012): x, y = layout.x, layout.y ratio = layout.ratio scale /= ratio self.y = y lr = layout.rotation tr = Affine2D().rotate_deg_around(x, y, lr) + ax.transAxes inv = ax.transAxes.inverted() start, end, si, ei, chr, orientation, span = ext flank = span / scale / 2 xstart, xend = x - flank, x + flank self.xstart, self.xend = xstart, xend cv = lambda t: xstart + abs(t - startbp) / scale hidden = layout.hidden # Chromosome if not hidden: ax.plot((xstart, xend), (y, y), color="gray", transform=tr, \ lw=2, zorder=1) self.genes = genes = bed[si: ei + 1] startbp, endbp = start.start, end.end if orientation == '-': startbp, endbp = endbp, startbp if switch: chr = switch.get(chr, chr) label = "-".join((human_size(startbp, target="Mb")[:-2], human_size(endbp, target="Mb"))) height = .012 self.gg = {} # Genes for g in genes: gstart, gend = g.start, g.end strand = g.strand if strand == '-': gstart, gend = gend, gstart if orientation == '-': strand = "+" if strand == "-" else "-" x1, x2 = cv(gstart), cv(gend) a, b = tr.transform((x1, y)), tr.transform((x2, y)) a, b = inv.transform(a), inv.transform(b) self.gg[g.accn] = (a, b) color = "b" if strand == "+" else "g" if not hidden: gp = Glyph(ax, x1, x2, y, height, gradient=False, fc=color, zorder=3) gp.set_transform(tr) ha, va = layout.ha, layout.va hpad = .02 if ha == "left": xx = xstart - hpad ha = "right" elif ha == "right": xx = xend + hpad ha = "left" else: xx = x ha = "center" # Tentative solution to labels stick into glyph magic = 40. cc = abs(lr) / magic if abs(lr) > magic else 1 if va == "top": yy = y + cc * pad elif va == "bottom": yy = y - cc * pad else: yy = y l = np.array((xx, yy)) trans_angle = ax.transAxes.transform_angles(np.array((lr, )), l.reshape((1, 2)))[0] lx, ly = l if not hidden and chr_label: ax.text(lx, ly + vpad, markup(chr), color=layout.color, ha=ha, va="center", rotation=trans_angle) ax.text(lx, ly - vpad, label, color="k", ha=ha, va="center", rotation=trans_angle)
def __init__(self, ax, ext, layout, bed, scale, switch=None, chr_label=True, pad=.04, vpad=.012): x, y = layout.x, layout.y ratio = layout.ratio scale /= ratio self.y = y lr = layout.rotation tr = mpl.transforms.Affine2D().\ rotate_deg_around(x, y, lr) + ax.transAxes inv = ax.transAxes.inverted() start, end, si, ei, chr, orientation, span = ext flank = span / scale / 2 xstart, xend = x - flank, x + flank self.xstart, self.xend = xstart, xend cv = lambda t: xstart + abs(t - startbp) / scale hidden = layout.hidden # Chromosome if not hidden: ax.plot((xstart, xend), (y, y), color="gray", transform=tr, \ lw=2, zorder=1) self.genes = genes = bed[si:ei + 1] startbp, endbp = start.start, end.end if orientation == '-': startbp, endbp = endbp, startbp if switch: chr = switch.get(chr, chr) label = "-".join( (human_size(startbp, target="Mb")[:-2], human_size(endbp, target="Mb"))) height = .012 self.gg = {} # Genes for g in genes: gstart, gend = g.start, g.end strand = g.strand if strand == '-': gstart, gend = gend, gstart if orientation == '-': strand = "+" if strand == "-" else "-" x1, x2 = cv(gstart), cv(gend) a, b = tr.transform((x1, y)), tr.transform((x2, y)) a, b = inv.transform(a), inv.transform(b) self.gg[g.accn] = (a, b) color = "b" if strand == "+" else "g" if not hidden: gp = Glyph(ax, x1, x2, y, height, gradient=False, fc=color, zorder=3) gp.set_transform(tr) ha, va = layout.ha, layout.va hpad = .02 if ha == "left": xx = xstart - hpad ha = "right" elif ha == "right": xx = xend + hpad ha = "left" else: xx = x ha = "center" # Tentative solution to labels stick into glyph magic = 40. cc = abs(lr) / magic if abs(lr) > magic else 1 if va == "top": yy = y + cc * pad elif va == "bottom": yy = y - cc * pad else: yy = y l = np.array((xx, yy)) trans_angle = ax.transAxes.transform_angles(np.array((lr, )), l.reshape((1, 2)))[0] lx, ly = l if not hidden and chr_label: ax.text(lx, ly + vpad, markup(chr), color=layout.color, ha=ha, va="center", rotation=trans_angle) ax.text(lx, ly - vpad, label, color="k", ha=ha, va="center", rotation=trans_angle)