File size: 3,667 Bytes
814a594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#%%
import os
import json
import numpy as np
import seaborn as sns
from scipy.stats import boxcox
from pycirclize import Circos
import matplotlib.pyplot as plt

base_dir = 'metadata'
with open(os.path.join(base_dir,'hierarchy.json'), 'r') as f:
    hierarchy_data = json.load(f)

with open(os.path.join(base_dir,'target_counts.json'), 'r') as f:
    target_counts = json.load(f)

with open(os.path.join(base_dir,'modality_counts.json'), 'r') as f:
    modality_counts = json.load(f)

# color scheme
sectors = {k: 0 for k in hierarchy_data.keys()}
for sector_name in hierarchy_data:
    for k,v in hierarchy_data[sector_name]['child'].items():
        sectors[sector_name] += len(v['child'])
    sectors[sector_name] += 1

name2color = {"organ": "#E41A1C", "abnormality": "#377EB8", "histology": "#4DAF4A"}

def generate_shades(base_color, n):
    return sns.light_palette(base_color, n + 2)[1:-1]

color_schemes = {}
for sector in sectors:
    child_colors = generate_shades(name2color[sector], len(hierarchy_data[sector]['child']))
    color_schemes[sector] = child_colors

parent_track_ratio = (72, 85)
middle_track_ratio =  (85, 100)
bar_track_ratio = (45, 70)
parent_track_font_size = 7
middle_track_font_size = 5.5
bar_track_font_size = 7
outer_track_font_size = 9

circos = Circos(sectors, space=8.8)
for sector in circos.sectors:
    idx2label = {}
    idx = 1
    for k,v in hierarchy_data[sector.name.lower()]['child'].items():
        for k1,v1 in v['child'].items():
            idx2label[idx] = k1
            idx += 1
    idx2label[idx] = ''
    idx2label[0] = ''

    track_outer = sector.add_track((100, 101))
    track_outer.xticks_by_interval(
        1,
        tick_length=0,
        outer=True,
        show_bottom_line=False,
        label_orientation="vertical",
        label_formatter=lambda v: idx2label[int(v)],
        label_size=outer_track_font_size,
        show_endlabel=True
    )

    track = sector.add_track(parent_track_ratio)
    track.axis(fc=name2color[sector.name], lw=0)
    track.text(sector.name.capitalize().replace('Mri', 'MRI').replace('Ct', 'CT').replace('Oct', 'OCT').replace('Dermoscopy', "DS"), color="white", size=parent_track_font_size)

    track1 = sector.add_track(middle_track_ratio, r_pad_ratio=0.1)
    sect_start = 0
    color_idx = 0
    for i, (k,v) in enumerate(hierarchy_data[sector.name.lower()]['child'].items()):
        sect_size = len(v['child']) if i != len(hierarchy_data[sector.name.lower()]['child'])-1 else len(v['child'])+1
        if i == 0:
            sect_size += 0.5
        if i == len(hierarchy_data[sector.name.lower()]['child'])-1:
            sect_size -= 0.5
        track1.rect(sect_start, sect_start+sect_size, r_lim=(middle_track_ratio[0], middle_track_ratio[1]-1), ec="black", lw=0,fc=color_schemes[sector.name][color_idx])
        color_idx += 1
        track1.text(k.replace('abnormality', 'abn.').replace(' anatomies', '').replace(' disturbance', '').replace('other abn.', 'Other').replace('liver', '').replace('pancreas', '').capitalize(), sect_start+sect_size/2, color="black", size=middle_track_font_size)
        sect_start += sect_size

    x = np.linspace(sector.start+1 , sector.end-1 , int(sector.size)-1)
    y = [target_counts[idx2label[i+1]] for i in range(0,len(x))]
    y_box = boxcox(y, 0.35)

    track2 = sector.add_track(bar_track_ratio, r_pad_ratio=0.1)
    track2.axis()
    track2.yticks([1.14, 2.29, 3.43, 4.58], ["10$^2$", "10$^3$", "10$^4$", "10$^5$"], label_size=bar_track_font_size-1)
    track2.bar(x, y_box, color=name2color[sector.name], alpha=0.5, align="center", lw=0)

fig = circos.plotfig()
fig.savefig('plots/figure_1a.pdf')
plt.show()

# %%