相关文章:

(一)数据准备与数据理解

(二)数据拼接

(三)生成图像与显示不全等问题

(四)颜色更改

(五)重排序

图像生成好了,但是颜色不喜欢怎么办?没错可以修改,最简单的,单个xy或者otu的颜色不喜欢,直接手动在E:\circos-0.69-9\test\etc\data\colors.conf将其对应颜色变量的三原色值修改了,如果需要统一修改,例如对XY进行分组,同一个分组的颜色值相同,那手动改起来就有点费劲了,而且每个新的表都要改。

于是加了几个txt:

借助工具绘制完整circos图(四)颜色修改_后缀

分别储存每个xy的对应分组、每个分组的颜色、每个OTU的颜色(因为OTU就十个,并且不需要分组)

读取分组和分组颜色,格式分别为:

1\sXY00000\n

1\s147,112,219\n

使用字典g储存XY到分组号的映射,使用cg储存分组号到颜色的映射,然后重新打开咱们之前输出文件夹的color.conf,通过colorxy00000得到XY00000后再通过两个字典得到颜色值,修改右侧的颜色信息,然后重新写入文件。otu颜色同理,因为没有分组所以一个字典就够了。

group=readfile('分组.txt')
color=readfile(outdata+'colors.conf')
colorgroup=readfile('分组颜色.txt')
mengroup=readfile('OTU颜色.txt')
cg=dict()
g=dict()
men=dict()
for gr in group:
    glist=gr.split('\t')
    g[glist[1][:-1]]=glist[0]
for c in colorgroup:
    clist=c.split('\t')
    cg[clist[0]]=clist[1]
for m in mengroup:
    mlist=m.split(' ')
    men[mlist[0]]=mlist[1]  
newcolor=list()
for c in color:
    clist=c.split(' ')
    name=clist[0][5:]
    if name.upper() in g:#修改XY颜色值
        line=clist[0]+' = '+cg[g[name.upper()]]
        newcolor.append(line)
    elif name in men:#修改OTU颜色值
        line=clist[0]+' = '+men[name]
        newcolor.append(line)
    else:#漏网之鱼
        newcolor.append(c)
savefile(outdata+'colors.conf',newcolor) 

为了被迫丰富这一部分的内容,所以加了ribbon颜色的更改。

系统默认的ribbon的颜色来自于colors_percentile.conf,一共不到二十个颜色而且紫色太多,于是被要求ribbon的颜色改为其连接的xy颜色或者otu的颜色,那这样的话需要修改cells.txt的内容了。

借助工具绘制完整circos图(四)颜色修改_颜色值_02

对于每两行相同的cell,修改color=colorxy0000或者colorotu_1就可以了,z的值想改就改,我因为偷懒并没改,看着所有的color后缀都是_a1,所以就不考虑。

例如将ribbon修改为otu的颜色值时,对于奇数行,我们通过分割得到name,即OTU_1,然后就能得到colorotu_1_a1;对于偶数行,不赋值name,这样name就是上一行的otu。(该代码是在cells拼接的时候额外增加的内容,所以看起来很长)

cell1=readfile(data1+'cells.txt')
cell2=readfile(data2+'cells.txt')
offset_cell=len(cell1)/2
cell=list()
for i in range(len(cell1)):
    c=cell1[i]
    clist=c.split(' ')
    if i%2==0:%如果奇数行,得到name
        name=clist[1]  
    colorname=clist[4].split(',')
    line=clist[0]+' '+clist[1]+' '+clist[2]+' '+clist[3]+' color=color'+name.lower()+','+colorname[1]
    
    cell.append(line)
for i in range(len(cell2)):
    c=cell2[i]
    clist=c.split(' ')
    if i%2==0:
        name=clist[1]
    cname=clist[0]
    cnum=str(int(cname[5:])+int(offset_cell))
    while len(cnum)<4:
        cnum='0'+cnum
    cnum='cell_'+cnum

    if clist[1][0:2]=='XY':
        line=cnum+' '+clist[1]+' '+clist[2]+' '+clist[3]+' color=color'+name.lower()+','+colorname[1]
        cell.append(line)
    else:
        if clist[1] in offset:
            num1=int(clist[2])+offset[clist[1]]
            num2=int(clist[3])+offset[clist[1]]
            line=cnum+' '+clist[1]+' '+str(num1)+' '+str(num2)+' color=color'+name.lower()+','+colorname[1]
        else:
            num1=int(clist[2])
            num2=int(clist[3])          
            line=cnum+' '+clist[1]+' '+str(num1)+' '+str(num2)+' color=color'+name.lower()+','+colorname[1]
        cell.append(line)
savefile(outdata+'cells.txt',cell) 

如果是想要用xy的颜色表示ribbon呢,因为xy在otu之后,不能“继承”上一行的name,所以将代码修改为,如果偶数行,那么就提取name,操作和刚刚相同;如果奇数行,那么读取下一行的字符串,然后分割得到相应的name。

cell1=readfile(data1+'cells.txt')
cell2=readfile(data2+'cells.txt')
offset_cell=len(cell1)/2
cell=list()
for i in range(len(cell1)):
    c=cell1[i]
    clist=c.split(' ')
    if i%2==1:
        name=clist[1]  
    else:
        cn=cell1[i+1]#下一行
        cl=cn.split(' ')
        name=cl[1]#下一行的label
    colorname=clist[4].split(',')
    line=clist[0]+' '+clist[1]+' '+clist[2]+' '+clist[3]+' color=color'+name.lower()+','+colorname[1]
    
    cell.append(line)
for i in range(len(cell2)):
    c=cell2[i]
    clist=c.split(' ')
    if i%2==1:
        name=clist[1]
    else:
        cn=cell2[i+1]
        cl=cn.split(' ')
        name=cl[1]
    cname=clist[0]
    cnum=str(int(cname[5:])+int(offset_cell))
    while len(cnum)<4:
        cnum='0'+cnum
    cnum='cell_'+cnum

    if clist[1][0:2]=='XY':
        line=cnum+' '+clist[1]+' '+clist[2]+' '+clist[3]+' color=color'+name.lower()+','+colorname[1]
        cell.append(line)
    else:
        if clist[1] in offset:
            num1=int(clist[2])+offset[clist[1]]
            num2=int(clist[3])+offset[clist[1]]
            line=cnum+' '+clist[1]+' '+str(num1)+' '+str(num2)+' color=color'+name.lower()+','+colorname[1]
        else:
            num1=int(clist[2])
            num2=int(clist[3])          
            line=cnum+' '+clist[1]+' '+str(num1)+' '+str(num2)+' color=color'+name.lower()+','+colorname[1]
        cell.append(line)
savefile(outdata+'cells.txt',cell) 

然后移动,生成图像就行,如果有其他改色要求,如每个xy的颜色都想改并且不相同,可以参照http://mkweb.bcgsc.ca/tableviewer/samples/的方法,将上传的表格加入颜色行或颜色列。当然,颜色值的修改也可以用记事本打开生成的svg,找到指定行后修改,不嫌麻烦的话。