In [ ]:
%load_ext autoreload
%autoreload 2
%matplotlib inline

from argparse import Namespace
import misc.logging_utils as logging_utils

args = Namespace()
logger = logging_utils.get_ipython_logger()

In [ ]:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns; sns.set(style='white')

import misc.bio_utils.bed_utils as bed_utils
import misc.mpl_utils as mpl_utils
import riboutils.ribo_utils as ribo_utils

In [ ]:
args.orfs = "/path/to/my/filtered.predicted-orfs.bed.gz"
args.out = "/path/to/my/filtered.predicted-orfs.bar-chart.pdf"
args.use_groups = False
args.title = "My title"

args.fontsize = 20
args.legend_fontsize = 15

In [ ]:
msg = "Reading bed file"
logger.info(msg)

bed = bed_utils.read_bed(args.orfs)

if args.use_groups:
    bed['orf_type_group'] = bed['orf_type'].map(ribo_utils.orf_type_labels_reverse_mapping)
    orf_type_counts = bed.groupby(['orf_type_group', 'strand']).size()
    orf_type_counts = orf_type_counts.reset_index(name="count")
    orf_type_counts['display_name'] = orf_type_counts['orf_type_group'].map(ribo_utils.orf_type_labels_display_name_map)
else:
    orf_type_counts = bed.groupby(['orf_type', 'strand']).size()
    orf_type_counts = orf_type_counts.reset_index(name="count")
    orf_type_counts['display_name'] = orf_type_counts['orf_type'].map(ribo_utils.orf_type_display_name_map)

msg = "Creating the bar chart"

color = sns.palettes.color_palette("Set3", n_colors=3)

fig, ax = plt.subplots(figsize=(9,5))
sns.barplot(
    x="display_name",
    y="count",
    hue="strand",
    data=orf_type_counts,
    ax=ax,
    zorder=-1,
    palette='Set3'
)

sns.despine()

ax.legend(
    loc='upper right', 
    bbox_to_anchor=(1.0, 1.1), 
    fontsize=args.legend_fontsize, 
    frameon=True, 
    framealpha=0.9,
    title="Strand"
)
mpl_utils.set_legend_title_fontsize(ax, args.fontsize)
#ax.legend_.remove()

ax.set_yscale('log')
ax.set_ylim((1, 1e4))

ax.set_ylabel("Number of ORFs", fontsize=args.fontsize)
ax.set_xlabel("", fontsize=0)

# rotate the ORF type names
mpl_utils.set_ticklabels_fontsize(ax, args.fontsize)
mpl_utils.set_ticklabel_rotation(ax, axis='x', rotation=90)

# place the ORF type names in the middle of the bar
for ticklabel in ax.xaxis.get_ticklabels():    
    p = ticklabel.get_position()
    ticklabel.set_position((p[0], 0.1))
    ticklabel.set_verticalalignment('bottom')
    
if args.title is not None:
    ax.set_title(args.title, fontsize=args.fontsize)
    
if args.out is not None:
    fig.savefig(args.out, bbox_inches='tight')