import pandas as pd import numpy as np from pycirclize import Circos import matplotlib.pyplot as plt from natsort import natsorted from pycirclize.utils import ColorCycler, load_eukaryote_example_dataset from matplotlib import rcParams plt.rcParams['figure.dpi'] = 300 rcParams['font.family'] = 'Arial' translocationPath = '/IPMNPDAC_WGS/Data/' chr_links = pd.read_csv(translocationPath + 'case7_15_translocations.csv') sampleIDs = list(set(chr_links.sampleID)) # natural order sampleIDs = natsorted(sampleIDs, key=lambda x: x.lstrip()) plt.rcParams["figure.figsize"] = (8,32*len(sampleIDs)) for sampleID in sampleIDs: # Load hg38 dataset (https://github.com/moshi4/pycirclize-data/tree/main/eukaryote/hg38) chr_bed_file, cytoband_file, _ = load_eukaryote_example_dataset("hg38") circos = Circos.initialize_from_bed(chr_bed_file, space=6) # Add cytoband tracks from cytoband file circos.add_cytoband_tracks((95, 100), cytoband_file) # Create chromosome color dict ColorCycler.set_cmap("hsv") chr_names = [s.name for s in circos.sectors] colors = ColorCycler.get_color_list(len(chr_names)) chr_name2color = {name: color for name, color in zip(chr_names, colors)} # Plot chromosome name & xticks for sector in circos.sectors: sector.text(sector.name, r=120, size=16, weight='bold', color=chr_name2color[sector.name]) sector.get_track("cytoband").xticks_by_interval(40000000,label_size=12, label_orientation="vertical", label_formatter=lambda v: f"{v / 1000000:.0f} Mb") # Plot chromosome link chr_links_case = chr_links[chr_links.sampleID.str.contains(sampleID)][list(chr_links)[:-1]] caseChrLinks = chr_links_case.query('sampleID==@sampleID')[list(chr_links_case)[1:]] caseChrLinks['chrom1'] = ['chr'+str(a) for a in caseChrLinks.chrom1] caseChrLinks['chrom2'] = ['chr'+str(b) for b in caseChrLinks.chrom2] caseChrLinks = list(caseChrLinks.itertuples(index=False, name=None)) for i, j in enumerate(caseChrLinks): region1 = j[:3] region2 = j[3:] color = chr_name2color[region1[0]] circos.link(region1, region2, color=color, lw=2.5) circos.text(sampleID, deg=315, r=150, size=16) fig=circos.plotfig();