import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np
[docs]def dna_features_plot(chrom, dna_df2,roi_start,roi_end,len_chr,plotting,variable):
"""Plot function for the genomic features per chromosome
Parameters
----------
chrom : str
- Region: e.g. chromosome number (either a normal number between 1 and 16 or in roman numerals between I and XVI),
a list like ['V', 0, 14790] which creates a barplot between basepair 0 and 14790) or a genename.
dna_df2 : pandas.dataframe
Dataframe containing information about the selected chromosome
roi_start : int
The start of the chromosome
roi_start,roi_end,region_type,chrom=input_region(region=region,verbose=verbose)
roi_end : int
The end of the chromosome
roi_start,roi_end,region_type,chrom=input_region(region=region,verbose=verbose)
len_chr : [type]
Length of the chromosome
dna_dict,start_chr,end_chr,len_chr,feature_orf_dict=gene_location(chrom,gene_position_dict,verbose)
plotting : optional
default True
variable : optional
default "reads"
"""
if plotting == True:
create_plottitle = chrom
noncoding_color = "#002538"
essential_color = "#10e372"
nonessential_color = "#d9252e"
codingdna_color = '#29a7e6'
textcolor = "#000000"
textsize = 14
plt.figure(figsize=(19,9))
grid = plt.GridSpec(20, 1, wspace=0.0, hspace=0.01)
axc = plt.subplot(grid[19,0])
axc.tick_params(labelsize=textsize)
axc.set_yticklabels([])
axc.tick_params(
axis='x', # changes apply to the x-axis
which='both', # both major and minor ticks are affected
bottom=False, # ticks along the bottom edge are off
top=False, # ticks along the top edge are off
labelbottom=False) # labels along the bottom edge are off
axc.tick_params(
axis='y', # changes apply to the y-axis
which='both', # both major and minor ticks are affected
left=False, # ticks along the bottom edge are off
right=False, # ticks along the top edge are off
labelleft=False) # labels along the bottom edge are off
ax = plt.subplot(grid[0:19,0])
ax.grid(linestyle='-', alpha=1.0)
ax.tick_params(labelsize=textsize)
ax.tick_params(axis='x', which='major', pad=30)
ax.ticklabel_format(axis='x', style='sci', scilimits=(0,0))
ax.xaxis.get_offset_text().set_fontsize(textsize)
ax.set_xlabel("Basepair position on chromosome "+chrom, fontsize=textsize, color=textcolor, labelpad=10)
ax.set_title(create_plottitle, fontsize=textsize, color=textcolor)
feature_middle_pos_list = []
sum_bp = 0
for x in dna_df2['Nbasepairs']:
feature_middle_pos_list.append(x/2 + sum_bp)
sum_bp += x
feature_width_list = list(dna_df2['Nbasepairs'])
barcolor_list = []
for feature in dna_df2['Feature_name']:
if feature == 'noncoding':
barcolor_list.append(noncoding_color)
elif dna_df2.loc[dna_df2['Feature_name'] == feature]['Essentiality'].iloc[0] == False:
barcolor_list.append(nonessential_color)
elif dna_df2.loc[dna_df2['Feature_name'] == feature]['Essentiality'].iloc[0] == True:
barcolor_list.append(essential_color)
elif dna_df2.loc[dna_df2['Feature_name'] == feature]['Essentiality'].iloc[0] == None:
barcolor_list.append(codingdna_color)
legend_noncoding = mpatches.Patch(color=noncoding_color, label="Noncoding DNA")
legend_essential = mpatches.Patch(color=essential_color, label="Annotated essential genes")
legend_nonessential = mpatches.Patch(color=nonessential_color, label="Nonessential genes")
legend_coding = mpatches.Patch(color=codingdna_color, label="Other genomic regions")
leg = ax.legend(handles=[legend_noncoding, legend_essential, legend_nonessential, legend_coding]) #ADD
for text in leg.get_texts():
text.set_color(textcolor)
if variable == "insertions":
ax.bar(feature_middle_pos_list, list(dna_df2['Ninsertions']), feature_width_list, color=barcolor_list)
ax.set_ylabel("Transposons per region", fontsize=textsize, color=textcolor)
elif variable == "reads":
ax.bar(feature_middle_pos_list, list(dna_df2['Nreads']), feature_width_list, color=barcolor_list)
ax.set_ylabel("Reads per region", fontsize=textsize, color=textcolor)
if roi_start != None and roi_end != None and roi_start < len_chr and roi_end < len_chr:
ax.set_xlim(roi_start, roi_end)
else:
ax.set_xlim(0, len_chr)
l = 0
counter = 0
for width in feature_width_list:
if dna_df2.loc[counter][4] == True:
axc.axvspan(l,l+width,facecolor=essential_color,alpha=0.3)
elif dna_df2.loc[counter][4] == False and not dna_df2.loc[counter][0] == 'noncoding':
axc.axvspan(l,l+width,facecolor=nonessential_color,alpha=0.3)
elif dna_df2.loc[counter][4] == None and not dna_df2.loc[counter][0] == 'noncoding':
axc.axvspan(l,l+width,facecolor=codingdna_color,alpha=0.5)
l += width
counter += 1
if roi_start != None and roi_end != None and roi_start < len_chr and roi_end < len_chr:
axc.set_xlim(roi_start, roi_end)
else:
axc.set_xlim(0, len_chr)