17.1.11 不同Track之间的Cross-Links¶
Biopython 1.59新增绘制不同track之间Cross-Links的功能,这个功能可用于将要展示的简单线形图中,也可用于将线形图分割为短片段(fragments)和环形图。
我们接着模仿Proux等人 [5] 的图像,我们需要一个包含基因之间的“cross links”、“得分”或“颜色”的列表。 实际应用中,可以从BLAST文件自动提取这些信息,这里是手动输入的。
噬菌体的名称同样表示为A,B和C。这里将要展示的是A与B之间的links,噬菌体A和B基因的相似百分比存储在元组中。
#Tuc2009 (NC_002703) vs bIL285 (AF323668)
A_vs_B = [
(99, "Tuc2009_01", "int"),
(33, "Tuc2009_03", "orf4"),
(94, "Tuc2009_05", "orf6"),
(100,"Tuc2009_06", "orf7"),
(97, "Tuc2009_07", "orf8"),
(98, "Tuc2009_08", "orf9"),
(98, "Tuc2009_09", "orf10"),
(100,"Tuc2009_10", "orf12"),
(100,"Tuc2009_11", "orf13"),
(94, "Tuc2009_12", "orf14"),
(87, "Tuc2009_13", "orf15"),
(94, "Tuc2009_14", "orf16"),
(94, "Tuc2009_15", "orf17"),
(88, "Tuc2009_17", "rusA"),
(91, "Tuc2009_18", "orf20"),
(93, "Tuc2009_19", "orf22"),
(71, "Tuc2009_20", "orf23"),
(51, "Tuc2009_22", "orf27"),
(97, "Tuc2009_23", "orf28"),
(88, "Tuc2009_24", "orf29"),
(26, "Tuc2009_26", "orf38"),
(19, "Tuc2009_46", "orf52"),
(77, "Tuc2009_48", "orf54"),
(91, "Tuc2009_49", "orf55"),
(95, "Tuc2009_52", "orf60"),
]
对噬菌体B和C做同样的处理:
#bIL285 (AF323668) vs Listeria innocua prophage 5 (in NC_003212)
B_vs_C = [
(42, "orf39", "lin2581"),
(31, "orf40", "lin2580"),
(49, "orf41", "lin2579"), #terL
(54, "orf42", "lin2578"), #portal
(55, "orf43", "lin2577"), #protease
(33, "orf44", "lin2576"), #mhp
(51, "orf46", "lin2575"),
(33, "orf47", "lin2574"),
(40, "orf48", "lin2573"),
(25, "orf49", "lin2572"),
(50, "orf50", "lin2571"),
(48, "orf51", "lin2570"),
(24, "orf52", "lin2568"),
(30, "orf53", "lin2567"),
(28, "orf54", "lin2566"),
]
噬菌体A和C的标识符(Identifiers)是基因座标签(locus tags),噬菌体B没有基因座标签,这里用基因名称来代替。以下的辅助函数可用基因座标签或基因名称来寻找Feature。
def get_feature(features, id, tags=["locus_tag", "gene"]):
"""Search list of SeqFeature objects for an identifier under the given tags."""
for f in features:
for key in tags:
#tag may not be present in this feature
for x in f.qualifiers.get(key, []):
if x == id:
return f
raise KeyError(id)
现在将这些标识符对(identifier pairs)的列表转换为“SeqFeature”列表,因此来查找它们的坐标定位。现在将下列代码添加到上段代码中 gd_diagram.draw(...) 这一行之前,将cross-links添加到图像中。示例中的脚本文件 Proux_et_al_2002_Figure_6.py 在Biopython源程序文件夹的 Doc/examples 目录下。
from Bio.Graphics.GenomeDiagram import CrossLink
from reportlab.lib import colors
#Note it might have been clearer to assign the track numbers explicitly...
for rec_X, tn_X, rec_Y, tn_Y, X_vs_Y in [(A_rec, 3, B_rec, 2, A_vs_B),
(B_rec, 2, C_rec, 1, B_vs_C)]:
track_X = gd_diagram.tracks[tn_X]
track_Y = gd_diagram.tracks[tn_Y]
for score, id_X, id_Y in X_vs_Y:
feature_X = get_feature(rec_X.features, id_X)
feature_Y = get_feature(rec_Y.features, id_Y)
color = colors.linearlyInterpolatedColor(colors.white, colors.firebrick, 0, 100, score)
link_xy = CrossLink((track_X, feature_X.location.start, feature_X.location.end),
(track_Y, feature_Y.location.start, feature_Y.location.end),
color, colors.lightgrey)
gd_diagram.cross_track_links.append(link_xy)
这段代码有几个要点,第一, GenomeDiagram 对象有一个 cross_track_links 属性,这个属性只是 CrossLink 对象的一组数据。每个 CrossLink 对象有两个track-specific坐标,示例中用元组(tuples)来展现,可用 GenomeDiagram.Feature 对象来代替。可选择添加颜色和边框颜色,还可以说明这个link是否需要翻转,这个功能易于表现染色体异位。
你也可以看我们是如何将BLAST中特征百分比(Percentage Identity Score)转换为白-红的渐变色(白-0%,红-100%)。这个实例中没有cross-links的重叠,如果有links重叠可以用ReportLab库中的透明度(transparency)来解决,通过设置颜色的alpha通道来使用。然而,若同时使用边框阴影和叠加透明度会增加理解的难度。结果见下图:
当然,Biopython还有很多增强图像效果的方法。首先,这个示例中的cross links是蛋白质之间的,被呈现在一个链的固定区域(strand specific manor)。可以在feature track上用 ‘BOX’ sigil添加背景区域(background region)来扩展cross link的效果。同样,可以缩短feature tracks之间的垂直高度,使用更多的links来代替——一种方法是为空的track分配空间。此外,在没有大规模基因重叠的情况下,可以用跨越轴线的”BIGARROW”,这样就为track进一步增加了垂直空间。详情请查看Biopython源程序的 Doc/examples 目录下的示例脚本文件:Proux_et_al_2002_Figure_6.py 。
结果见下图:
除此之外,你可能希望在图像编辑软件里手动调整gene标签的位置,添加特定标识,比如强调某个特别的区域。
如果有多个叠加的links,使用ReportLab库里的颜色透明度(transparent color)是非常好的方法,由于这个示例没有cross-link的重叠,所以没有用到颜色透明度(transparent color)。然而,尽量避免在这个示例中使用边框阴影(shaded color scheme)。