def pomegranate(args): """ %prog cotton seqids karyotype.layout mcscan.out all.bed synteny.layout Build a figure that calls graphics.karyotype to illustrate the high ploidy of WGD history of pineapple genome. The script calls both graphics.karyotype and graphic.synteny. """ p = OptionParser(pomegranate.__doc__) opts, args, iopts = p.set_image_options(args, figsize="9x7") if len(args) != 5: sys.exit(not p.print_help()) seqidsfile, klayout, datafile, bedfile, slayout = args fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) Karyotype(fig, root, seqidsfile, klayout) Synteny(fig, root, datafile, bedfile, slayout) # legend showing the orientation of the genes draw_gene_legend(root, 0.42, 0.52, 0.48) labels = ((0.04, 0.96, "A"), (0.04, 0.52, "B")) panel_labels(root, labels) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() pf = "pomegranate-karyotype" image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def oropetium(args): """ %prog oropetium mcscan.out all.bed layout switch.ids Build a composite figure that calls graphis.synteny. """ p = OptionParser(oropetium.__doc__) p.add_option("--extra", help="Extra features in BED format") opts, args, iopts = p.set_image_options(args, figsize="9x6") if len(args) != 4: sys.exit(not p.print_help()) datafile, bedfile, slayout, switch = args fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) Synteny( fig, root, datafile, bedfile, slayout, switch=switch, extra_features=opts.extra ) # legend showing the orientation of the genes draw_gene_legend(root, 0.4, 0.57, 0.74, text=True, repeat=True) # On the left panel, make a species tree fc = "lightslategrey" coords = {} xs, xp = 0.16, 0.03 coords["oropetium"] = (xs, 0.7) coords["setaria"] = (xs, 0.6) coords["sorghum"] = (xs, 0.5) coords["rice"] = (xs, 0.4) coords["brachypodium"] = (xs, 0.3) xs -= xp coords["Panicoideae"] = join_nodes(root, coords, "setaria", "sorghum", xs) xs -= xp coords["BEP"] = join_nodes(root, coords, "rice", "brachypodium", xs) coords["PACMAD"] = join_nodes(root, coords, "oropetium", "Panicoideae", xs) xs -= xp coords["Poaceae"] = join_nodes(root, coords, "BEP", "PACMAD", xs) # Names of the internal nodes for tag in ("BEP", "Poaceae"): nx, ny = coords[tag] nx, ny = nx - 0.005, ny - 0.02 root.text(nx, ny, tag, rotation=90, ha="right", va="top", color=fc) for tag in ("PACMAD",): nx, ny = coords[tag] nx, ny = nx - 0.005, ny + 0.02 root.text(nx, ny, tag, rotation=90, ha="right", va="bottom", color=fc) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() pf = "oropetium" image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def litchi(args): """ %prog litchi mcscan.out all.bed layout switch.ids Build a composite figure that calls graphis.synteny. """ p = OptionParser(litchi.__doc__) opts, args, iopts = p.set_image_options(args, figsize="9x6") if len(args) != 4: sys.exit(not p.print_help()) datafile, bedfile, slayout, switch = args fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) Synteny(fig, root, datafile, bedfile, slayout, switch=switch) # legend showing the orientation of the genes draw_gene_legend(root, .4, .7, .82) # On the left panel, make a species tree fc = 'lightslategrey' coords = {} xs, xp = .16, .03 coords["lychee"] = (xs, .37) coords["clementine"] = (xs, .5) coords["cacao"] = (xs, .6) coords["strawberry"] = (xs, .7) coords["grape"] = (xs, .8) xs -= xp coords["Sapindales"] = join_nodes(root, coords, "clementine", "lychee", xs) xs -= xp coords["Rosid-II"] = join_nodes(root, coords, "cacao", "Sapindales", xs) xs -= xp coords["Rosid"] = join_nodes(root, coords, "strawberry", "Rosid-II", xs) xs -= xp coords["crown"] = join_nodes(root, coords, "grape", "Rosid", xs, circle=False) # Names of the internal nodes for tag in ("Rosid", "Rosid-II", "Sapindales"): nx, ny = coords[tag] nx, ny = nx - .01, ny - .02 root.text(nx, ny, tag, rotation=90, ha="right", va="top", color=fc) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() pf = "litchi" image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def utricularia(args): from jcvi.graphics.synteny import main as synteny_main p = OptionParser(synteny_main.__doc__) p.add_option("--switch", help="Rename the seqid with two-column file") opts, args, iopts = p.set_image_options(args, figsize="8x7") if len(args) != 3: sys.exit(not p.print_help()) datafile, bedfile, layoutfile = args switch = opts.switch pf = datafile.rsplit(".", 1)[0] fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) s = Synteny(fig, root, datafile, bedfile, layoutfile, loc_label=False, switch=switch) light = "lightslategrey" RoundRect(root, (0.02, 0.69), 0.96, 0.24, fill=False, lw=2, ec=light) RoundRect(root, (0.02, 0.09), 0.96, 0.48, fill=False, lw=2, ec=light) za, zb = s.layout[1].ratio, s.layout[-1].ratio # zoom level if za != 1: root.text( 0.96, 0.89, "{}x zoom".format(za).replace(".0x", "x"), color=light, ha="right", va="center", size=14, ) if zb != 1: root.text( 0.96, 0.12, "{}x zoom".format(zb).replace(".0x", "x"), color=light, ha="right", va="center", size=14, ) # legend showing the orientation of the genes draw_gene_legend(root, 0.22, 0.3, 0.64, text=True) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def draw_ploidy(fig, root, blocksfile, bedfile, blockslayout): switchidsfile = "switch.ids" Synteny( fig, root, blocksfile, bedfile, blockslayout, scalebar=True, switch=switchidsfile, ) # Legend showing the orientation of the genes draw_gene_legend(root, 0.2, 0.3, 0.53) # WGD labels radius = 0.025 tau_color = "#bebada" alpha_color = "#bc80bd" label_color = "k" pad = 0.05 for y in (0.74 + 1.5 * pad, 0.26 - 1.5 * pad): TextCircle( root, 0.25, y, r"$\alpha^{O}$", radius=radius, fc=alpha_color, color=label_color, fontweight="bold", ) TextCircle( root, 0.75, y, r"$\alpha^{O}$", radius=radius, fc=alpha_color, color=label_color, fontweight="bold", ) for y in (0.74 + 3 * pad, 0.26 - 3 * pad): TextCircle(root, 0.5, y, r"$\tau$", radius=radius, fc=tau_color, color=label_color)
def amborella(args): """ %prog amborella seqids karyotype.layout mcscan.out all.bed synteny.layout Build a composite figure that calls graphics.karyotype and graphics.synteny. """ p = OptionParser(amborella.__doc__) p.add_option( "--tree", help="Display trees on the bottom of the figure [default: %default]") p.add_option( "--switch", help="Rename the seqid with two-column file [default: %default]") opts, args, iopts = p.set_image_options(args, figsize="8x7") if len(args) != 5: sys.exit(not p.print_help()) seqidsfile, klayout, datafile, bedfile, slayout = args switch = opts.switch tree = opts.tree fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) Karyotype(fig, root, seqidsfile, klayout) Synteny(fig, root, datafile, bedfile, slayout, switch=switch, tree=tree) # legend showing the orientation of the genes draw_gene_legend(root, .5, .68, .5) # annotate the WGD events fc = 'lightslategrey' x = .05 radius = .012 TextCircle(root, x, .86, '$\gamma$', radius=radius) TextCircle(root, x, .95, '$\epsilon$', radius=radius) root.plot([x, x], [.83, .9], ":", color=fc, lw=2) pts = plot_cap((x, .95), np.radians(range(-70, 250)), .02) x, y = zip(*pts) root.plot(x, y, ":", color=fc, lw=2) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() pf = "amborella" image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def ploidy(args): """ %prog ploidy seqids karyotype.layout mcscan.out all.bed synteny.layout Build a figure that calls graphics.karyotype to illustrate the high ploidy of WGD history of pineapple genome. The script calls both graphics.karyotype and graphic.synteny. """ p = OptionParser(ploidy.__doc__) p.add_option("--switch", help="Rename the seqid with two-column file") opts, args, iopts = p.set_image_options(args, figsize="9x7") if len(args) != 5: sys.exit(not p.print_help()) seqidsfile, klayout, datafile, bedfile, slayout = args fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) Karyotype(fig, root, seqidsfile, klayout) Synteny(fig, root, datafile, bedfile, slayout, switch=opts.switch) # legend showing the orientation of the genes draw_gene_legend(root, .27, .37, .52) # annotate the WGD events fc = 'lightslategrey' x = .09 radius = .012 TextCircle(root, x, .825, r'$\tau$', radius=radius, fc=fc) TextCircle(root, x, .8, r'$\sigma$', radius=radius, fc=fc) TextCircle(root, x, .72, r'$\rho$', radius=radius, fc=fc) for ypos in (.825, .8, .72): root.text(.12, ypos, r"$\times2$", color=fc, ha="center", va="center") root.plot([x, x], [.85, .775], ":", color=fc, lw=2) root.plot([x, x], [.75, .675], ":", color=fc, lw=2) labels = ((.04, .96, 'A'), (.04, .54, 'B')) panel_labels(root, labels) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() pf = "pineapple-karyotype" image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def cotton(args): """ %prog cotton seqids karyotype.layout mcscan.out all.bed synteny.layout Build a composite figure that calls graphics.karyotype and graphic.synteny. """ p = OptionParser(cotton.__doc__) p.add_option("--depthfile", help="Use depth info in this file [default: %default]") p.add_option( "--switch", help="Rename the seqid with two-column file [default: %default]") opts, args, iopts = p.set_image_options(args, figsize="8x7") if len(args) != 5: sys.exit(p.print_help()) seqidsfile, klayout, datafile, bedfile, slayout = args switch = opts.switch depthfile = opts.depthfile fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) kt = Karyotype(fig, root, seqidsfile, klayout) Synteny(fig, root, datafile, bedfile, slayout, switch=switch) light = "lightslategrey" # Show the dup depth along the cotton chromosomes if depthfile: ymin, ymax = .9, .95 root.text(.11, .96, "Cotton duplication level", color="gray", size=10) root.plot([.1, .95], [ymin, ymin], color="gray") root.text(.96, .9, "1x", color="gray", va="center") root.plot([.1, .95], [ymax, ymax], color="gray") root.text(.96, .95, "6x", color="gray", va="center") fp = open(depthfile) track = kt.tracks[0] # Cotton depths = [] for row in fp: a, b, depth = row.split() depth = int(depth) try: p = track.get_coords(a) depths.append((p, depth)) except KeyError: pass depths.sort(key=lambda x: (x[0], -x[1])) xx, yy = zip(*depths) yy = [ymin + .01 * (x - 1) for x in yy] root.plot(xx, yy, "-", color=light) # legend showing the orientation of the genes draw_gene_legend(root, .5, .68, .5) # Zoom xpos = .835 ytop = .9 xmin, xmax = .18, .82 ymin, ymax = ytop, .55 lc = "k" kwargs = dict(lw=3, color=lc, mec=lc, mfc="w", zorder=3) root.plot((xpos, xpos), (ymax, .63), ":o", **kwargs) root.plot((xpos, xmin), (ymax, ymin), ":o", **kwargs) root.plot((xpos, xmax), (ymax, ymin), ":o", **kwargs) RoundRect(root, (.06, .17), .92, .35, fill=False, lw=2, ec=light) # Panels root.text(.05, .95, "a", size=20, fontweight="bold") root.text(.1, .45, "b", size=20, fontweight="bold") root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() pf = "cotton" image_name = pf + "." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def expr(args): """ %prog expr block exp layout napus.bed Plot a composite figure showing synteny and the expression level between homeologs in two tissues - total 4 lists of values. block file contains the gene pairs between AN and CN. """ from jcvi.graphics.base import red_purple as default_cm p = OptionParser(expr.__doc__) opts, args, iopts = p.set_image_options(args, figsize="8x5") if len(args) != 4: sys.exit(not p.print_help()) block, exp, layout, napusbed = args fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) s = Synteny(fig, root, block, napusbed, layout) # Import the expression values # Columns are: leaf-A, leaf-C, root-A, root-C fp = open(exp) data = {} for row in fp: gid, lf, rt = row.split() lf, rt = float(lf), float(rt) data[gid] = (lf, rt) rA, rB = s.rr gA = [x.accn for x in rA.genes] gC = [x.accn for x in rB.genes] A = [data.get(x, (0, 0)) for x in gA] C = [data.get(x, (0, 0)) for x in gC] A = np.array(A) C = np.array(C) A = np.transpose(A) C = np.transpose(C) d, h = .01, .1 lsg = "lightslategrey" coords = s.gg # Coordinates of the genes axes = [] for j, (y, gg) in enumerate(((.79, gA), (.24, gC))): r = s.rr[j] x = r.xstart w = r.xend - r.xstart ax = fig.add_axes([x, y, w, h]) axes.append(ax) root.add_patch( Rectangle((x - h, y - d), w + h + d, h + 2 * d, fill=False, ec=lsg, lw=1)) root.text(x - d, y + 3 * h / 4, "root", ha="right", va="center") root.text(x - d, y + h / 4, "leaf", ha="right", va="center") ty = y - 2 * d if y > .5 else y + h + 2 * d nrows = len(gg) for i, g in enumerate(gg): start, end = coords[(j, g)] sx, sy = start ex, ey = end assert sy == ey sy = sy + 2 * d if sy > .5 else sy - 2 * d root.plot(((sx + ex) / 2, x + w * (i + .5) / nrows), (sy, ty), lw=1, ls=":", color="k", alpha=.2) axA, axC = axes p = axA.pcolormesh(A, cmap=default_cm) p = axC.pcolormesh(C, cmap=default_cm) axA.set_xlim(0, len(gA)) axC.set_xlim(0, len(gC)) x, y, w, h = .35, .1, .3, .05 ax_colorbar = fig.add_axes([x, y, w, h]) fig.colorbar(p, cax=ax_colorbar, orientation='horizontal') root.text(x - d, y + h / 2, "RPKM", ha="right", va="center") root.set_xlim(0, 1) root.set_ylim(0, 1) for x in (axA, axC, root): x.set_axis_off() image_name = "napusf4b." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)
def fig4(args): """ %prog fig4 layout data Napus Figure 4A displays an example deleted region for quartet chromosomes, showing read alignments from high GL and low GL lines. """ p = OptionParser(fig4.__doc__) p.add_option("--gauge_step", default=200000, type="int", help="Step size for the base scale") opts, args, iopts = p.set_image_options(args, figsize="9x7") if len(args) != 2: sys.exit(not p.print_help()) layout, datadir = args layout = F4ALayout(layout, datadir=datadir) gs = opts.gauge_step fig = plt.figure(1, (iopts.w, iopts.h)) root = fig.add_axes([0, 0, 1, 1]) block, napusbed, slayout = "r28.txt", "all.bed", "r28.layout" s = Synteny(fig, root, block, napusbed, slayout, chr_label=False) synteny_exts = [(x.xstart, x.xend) for x in s.rr] h = .1 order = "bzh,yudal".split(",") labels = (r"\textit{B. napus} A$\mathsf{_n}$2", r"\textit{B. rapa} A$\mathsf{_r}$2", r"\textit{B. oleracea} C$\mathsf{_o}$2", r"\textit{B. napus} C$\mathsf{_n}$2") for t in layout: xstart, xend = synteny_exts[2 * t.i] canvas = [xstart, t.y, xend - xstart, h] root.text(xstart - h, t.y + h / 2, labels[t.i], ha="center", va="center") ch, ab = t.box_region.split(":") a, b = ab.split("-") vlines = [int(x) for x in (a, b)] Coverage(fig, root, canvas, t.seqid, (t.start, t.end), datadir, order=order, gauge="top", plot_chr_label=False, gauge_step=gs, palette="gray", cap=40, hlsuffix="regions.forhaibao", vlines=vlines) # Highlight GSL biosynthesis genes a, b = (3, "Bra029311"), (5, "Bo2g161590") for gid in (a, b): start, end = s.gg[gid] xstart, ystart = start xend, yend = end x = (xstart + xend) / 2 arrow = FancyArrowPatch(posA=(x, ystart - .04), posB=(x, ystart - .005), arrowstyle="fancy,head_width=6,head_length=8", lw=3, fc='k', ec='k', zorder=20) root.add_patch(arrow) root.set_xlim(0, 1) root.set_ylim(0, 1) root.set_axis_off() image_name = "napus-fig4." + iopts.format savefig(image_name, dpi=iopts.dpi, iopts=iopts)